mirror of https://github.com/GNOME/gimp.git
app/gimpimage.[ch] app/gimage_cmds.[ch] Added merge down procedure, I'm
Mon Aug 31 16:33:11 CDT 1998 Larry Ewing <lewing@gimp.org> * app/gimpimage.[ch] * app/gimage_cmds.[ch] * app/layers_dialog.c: Added merge down procedure, I'm not really sure if this behaves the way people expect it to, so please send me any comments on what it actually should do. It also needs a little testing, especially the pdb call. * app/gimpimage.c: cleaned up Seth's merge commit a little. Also changed the mode of a merged layer to normal, as this seems to be the proper thing. Discussion is welcome here as well.
This commit is contained in:
parent
eeca444ba3
commit
3c7bb378d7
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
Mon Aug 31 16:33:11 CDT 1998 Larry Ewing <lewing@gimp.org>
|
||||
|
||||
* app/gimpimage.[ch]
|
||||
* app/gimage_cmds.[ch]
|
||||
* app/layers_dialog.c: Added merge down procedure, I'm not really
|
||||
sure if this behaves the way people expect it to, so please send
|
||||
me any comments on what it actually should do. It also needs a
|
||||
little testing, especially the pdb call.
|
||||
|
||||
* app/gimpimage.c: cleaned up Seth's merge commit a little. Also
|
||||
changed the mode of a merged layer to normal, as this seems to be
|
||||
the proper thing. Discussion is welcome here as well.
|
||||
|
||||
Mon Aug 31 19:16:36 BST 1998 Adam D. Moss <adam@gimp.org>
|
||||
|
||||
* app/gimpimage.c: I'm pleased to say that lewing doesn't
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -1735,6 +1735,105 @@ ProcRecord gimage_merge_visible_layers_proc =
|
|||
};
|
||||
|
||||
|
||||
|
||||
/*********************************************/
|
||||
/* GIMAGE_MERGE_DOWN */
|
||||
|
||||
static Argument *
|
||||
gimage_merge_down_invoker (Argument *args)
|
||||
{
|
||||
GImage *gimage;
|
||||
MergeType merge_type;
|
||||
Layer *layer;
|
||||
Argument *return_args;
|
||||
|
||||
merge_type = ExpandAsNecessary;
|
||||
layer = NULL;
|
||||
|
||||
success = TRUE;
|
||||
if (success)
|
||||
{
|
||||
int_value = args[0].value.pdb_int;
|
||||
if ((gimage = gimage_get_ID (int_value)) == NULL)
|
||||
success = FALSE;
|
||||
}
|
||||
if (success)
|
||||
{
|
||||
int_value = args[1].value.pdb_int;
|
||||
if ((layer = layer_get_ID (int_value)) == NULL)
|
||||
success = FALSE;
|
||||
}
|
||||
if (success)
|
||||
{
|
||||
int_value = args[2].value.pdb_int;
|
||||
switch (int_value)
|
||||
{
|
||||
case 0: merge_type = ExpandAsNecessary; break;
|
||||
case 1: merge_type = ClipToImage; break;
|
||||
case 2: merge_type = ClipToBottomLayer; break;
|
||||
default: success = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (success)
|
||||
success = ((layer = gimp_image_merge_down (gimage, layer, merge_type)) != NULL);
|
||||
return_args = procedural_db_return_args (&gimage_merge_down_proc, success);
|
||||
|
||||
if (success)
|
||||
return_args[1].value.pdb_int = drawable_ID (GIMP_DRAWABLE(layer));
|
||||
|
||||
return return_args;
|
||||
}
|
||||
|
||||
/* The procedure definition */
|
||||
ProcArg gimage_merge_down_args[] =
|
||||
{
|
||||
{ PDB_IMAGE,
|
||||
"image",
|
||||
"The image"
|
||||
},
|
||||
{ PDB_LAYER,
|
||||
"layer"
|
||||
"The layer to merge down from"
|
||||
},
|
||||
{ PDB_INT32,
|
||||
"merge_type",
|
||||
"The type of merge: { EXPAND-AS-NECESSARY (0), CLIP-TO-IMAGE (1), CLIP-TO-BOTTOM-LAYER (2) }"
|
||||
}
|
||||
};
|
||||
|
||||
ProcArg gimage_merge_down_out_args[] =
|
||||
{
|
||||
{ PDB_LAYER,
|
||||
"layer",
|
||||
"The resulting layer"
|
||||
}
|
||||
};
|
||||
|
||||
ProcRecord gimage_merge_down_proc =
|
||||
{
|
||||
"gimp_image_merge_down",
|
||||
"Merge the layer passed and the first visible layer below",
|
||||
"This procedure combines the passed layer and the first visible layer below it using the specified merge type. A merge type of EXPAND-AS-NECESSARY expands the final layer to encompass the areas of the visible layers. A merge type of CLIP-TO-IMAGE clips the final layer to the extents of the image. A merge type of CLIP-TO-BOTTOM-LAYER clips the final layer to the size of the bottommost layer.",
|
||||
"Larry Ewing",
|
||||
"Larry Ewing",
|
||||
"1998",
|
||||
PDB_INTERNAL,
|
||||
|
||||
/* Input arguments */
|
||||
3,
|
||||
gimage_merge_down_args,
|
||||
|
||||
/* Output arguments */
|
||||
1,
|
||||
gimage_merge_down_out_args,
|
||||
|
||||
/* Exec method */
|
||||
{ { gimage_merge_down_invoker } },
|
||||
};
|
||||
|
||||
|
||||
|
||||
/********************/
|
||||
/* GIMAGE_FLATTEN */
|
||||
|
||||
|
@ -2599,6 +2698,7 @@ gimage_set_filename_invoker (Argument *args)
|
|||
{
|
||||
GImage *gimage;
|
||||
char *filename;
|
||||
char *new_filename;
|
||||
|
||||
success = TRUE;
|
||||
if (success)
|
||||
|
@ -2611,7 +2711,10 @@ gimage_set_filename_invoker (Argument *args)
|
|||
}
|
||||
|
||||
if (success)
|
||||
gimage_set_filename (gimage, (char *) args[1].value.pdb_pointer);
|
||||
{
|
||||
new_filename = (char *) args[1].value.pdb_pointer;
|
||||
gimage_set_filename (gimage, new_filename);
|
||||
}
|
||||
|
||||
return procedural_db_return_args (&gimage_set_filename_proc, success);
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@ extern ProcRecord gimage_pick_correlate_layer_proc;
|
|||
extern ProcRecord gimage_raise_layer_proc;
|
||||
extern ProcRecord gimage_lower_layer_proc;
|
||||
extern ProcRecord gimage_merge_visible_layers_proc;
|
||||
extern ProcRecord gimage_merge_down_proc;
|
||||
extern ProcRecord gimage_flatten_proc;
|
||||
extern ProcRecord gimage_add_layer_proc;
|
||||
extern ProcRecord gimage_remove_layer_proc;
|
||||
|
|
|
@ -2334,7 +2334,6 @@ gimp_image_merge_visible_layers (GimpImage *gimage, MergeType merge_type)
|
|||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
layer->opacity = 255;
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
|
@ -2369,6 +2368,54 @@ gimp_image_flatten (GimpImage *gimage)
|
|||
return layer;
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_down (GimpImage *gimage,
|
||||
Layer *current_layer,
|
||||
MergeType merge_type)
|
||||
{
|
||||
GSList *layer_list;
|
||||
GSList *merge_list= NULL;
|
||||
Layer *layer = NULL;
|
||||
|
||||
|
||||
layer_list = gimage->layers;
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (layer == current_layer)
|
||||
{
|
||||
printf ("found it\n");
|
||||
|
||||
layer_list = g_slist_next (layer_list);
|
||||
while (layer_list)
|
||||
{
|
||||
layer = (Layer *) layer_list->data;
|
||||
if (drawable_visible (GIMP_DRAWABLE(layer)))
|
||||
{
|
||||
merge_list = g_slist_append (merge_list, layer);
|
||||
printf ("found the next\n");
|
||||
layer_list = NULL;
|
||||
}
|
||||
else
|
||||
layer_list = g_slist_next (layer_list);
|
||||
}
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
}
|
||||
}
|
||||
|
||||
if (merge_list && merge_list->next)
|
||||
{
|
||||
layer = gimp_image_merge_layers (gimage, merge_list, merge_type);
|
||||
g_slist_free (merge_list);
|
||||
return layer;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_message ("There are not enough visible layers for a merge down.");
|
||||
g_slist_free (merge_list);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Layer *
|
||||
gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_type)
|
||||
|
@ -2495,14 +2542,17 @@ gimp_image_merge_layers (GimpImage *gimage, GSList *merge_list, MergeType merge_
|
|||
}
|
||||
else
|
||||
{
|
||||
/* The final merged layer inherits the attributes of the bottomost layer,
|
||||
* with a notable exception: The resulting layer has an alpha channel
|
||||
/* The final merged layer inherits the name of the bottom most layer
|
||||
* and the resulting layer has an alpha channel
|
||||
* whether or not the original did
|
||||
* Opacity is set to 100% and the MODE is set to normal
|
||||
*/
|
||||
merge_layer = layer_new (gimage, (x2 - x1), (y2 - y1),
|
||||
drawable_type_with_alpha (GIMP_DRAWABLE(layer)),
|
||||
drawable_name (GIMP_DRAWABLE(layer)),
|
||||
layer->opacity, layer->mode);
|
||||
OPAQUE_OPACITY, NORMAL_MODE);
|
||||
|
||||
|
||||
|
||||
if (!merge_layer) {
|
||||
g_message ("gimp_image_merge_layers: could not allocate merge layer");
|
||||
|
|
|
@ -147,6 +147,7 @@ void gimp_image_set_layer_mask_show (GimpImage *, int);
|
|||
Layer * gimp_image_raise_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_lower_layer (GimpImage *, Layer *);
|
||||
Layer * gimp_image_merge_visible_layers (GimpImage *, MergeType);
|
||||
Layer * gimp_image_merge_down (GimpImage *, Layer *, MergeType);
|
||||
Layer * gimp_image_flatten (GimpImage *);
|
||||
Layer * gimp_image_merge_layers (GimpImage *, GSList *, MergeType);
|
||||
Layer * gimp_image_add_layer (GimpImage *, Layer *, int);
|
||||
|
|
|
@ -162,6 +162,7 @@ static void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer);
|
|||
static void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_merge_layers_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_merge_down_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_flatten_image_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_alpha_select_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_mask_select_callback (GtkWidget *, gpointer);
|
||||
|
@ -241,6 +242,8 @@ static MenuItem layers_ops[] =
|
|||
layers_dialog_anchor_layer_callback, NULL, NULL, NULL },
|
||||
{ "Merge Visible Layers", 'M', GDK_CONTROL_MASK,
|
||||
layers_dialog_merge_layers_callback, NULL, NULL, NULL },
|
||||
{ "Merge Down", 'M', GDK_CONTROL_MASK,
|
||||
layers_dialog_merge_down_callback, NULL, NULL, NULL },
|
||||
{ "Flatten Image", 0, 0,
|
||||
layers_dialog_flatten_image_callback, NULL, NULL, NULL },
|
||||
{ "Alpha To Selection", 0, 0,
|
||||
|
@ -1218,14 +1221,16 @@ layers_dialog_set_menu_sensitivity ()
|
|||
ops_button_set_sensitive (layers_ops_buttons[5], !fs && ac && gimage && lp);
|
||||
/* merge visible layers */
|
||||
gtk_widget_set_sensitive (layers_ops[10].widget, fs && ac && gimage && lp);
|
||||
/* flatten image */
|
||||
/* merge visible layers */
|
||||
gtk_widget_set_sensitive (layers_ops[11].widget, fs && ac && gimage && lp);
|
||||
/* flatten image */
|
||||
gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp);
|
||||
/* alpha select */
|
||||
gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp && alpha);
|
||||
gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lp && alpha);
|
||||
/* mask select */
|
||||
gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lm && lp);
|
||||
gtk_widget_set_sensitive (layers_ops[14].widget, fs && ac && gimage && lm && lp);
|
||||
/* add alpha */
|
||||
gtk_widget_set_sensitive (layers_ops[14].widget, !alpha);
|
||||
gtk_widget_set_sensitive (layers_ops[15].widget, !alpha);
|
||||
|
||||
/* set mode, preserve transparency and opacity to insensitive if there are no layers */
|
||||
gtk_widget_set_sensitive (layersD->preserve_trans, lp);
|
||||
|
@ -1789,6 +1794,20 @@ layers_dialog_merge_layers_callback (GtkWidget *w,
|
|||
layers_dialog_layer_merge_query (gimage, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data)
|
||||
{
|
||||
GImage *gimage;
|
||||
/* if there is a currently selected gimage
|
||||
*/
|
||||
if (!layersD)
|
||||
return;
|
||||
if (! (gimage = layersD->gimage))
|
||||
return;
|
||||
|
||||
gimp_image_merge_down (gimage, gimage->active_layer, ExpandAsNecessary);
|
||||
gdisplays_flush ();
|
||||
}
|
||||
|
||||
static void
|
||||
layers_dialog_flatten_image_callback (GtkWidget *w,
|
||||
|
@ -3988,3 +4007,4 @@ layers_dialog_layer_merge_query (GImage *gimage,
|
|||
gtk_widget_show (vbox);
|
||||
gtk_widget_show (options->query_box);
|
||||
}
|
||||
|
||||
|
|
|
@ -162,6 +162,7 @@ static void layers_dialog_add_layer_mask_callback (GtkWidget *, gpointer);
|
|||
static void layers_dialog_apply_layer_mask_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_anchor_layer_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_merge_layers_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_merge_down_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_flatten_image_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_alpha_select_callback (GtkWidget *, gpointer);
|
||||
static void layers_dialog_mask_select_callback (GtkWidget *, gpointer);
|
||||
|
@ -241,6 +242,8 @@ static MenuItem layers_ops[] =
|
|||
layers_dialog_anchor_layer_callback, NULL, NULL, NULL },
|
||||
{ "Merge Visible Layers", 'M', GDK_CONTROL_MASK,
|
||||
layers_dialog_merge_layers_callback, NULL, NULL, NULL },
|
||||
{ "Merge Down", 'M', GDK_CONTROL_MASK,
|
||||
layers_dialog_merge_down_callback, NULL, NULL, NULL },
|
||||
{ "Flatten Image", 0, 0,
|
||||
layers_dialog_flatten_image_callback, NULL, NULL, NULL },
|
||||
{ "Alpha To Selection", 0, 0,
|
||||
|
@ -1218,14 +1221,16 @@ layers_dialog_set_menu_sensitivity ()
|
|||
ops_button_set_sensitive (layers_ops_buttons[5], !fs && ac && gimage && lp);
|
||||
/* merge visible layers */
|
||||
gtk_widget_set_sensitive (layers_ops[10].widget, fs && ac && gimage && lp);
|
||||
/* flatten image */
|
||||
/* merge visible layers */
|
||||
gtk_widget_set_sensitive (layers_ops[11].widget, fs && ac && gimage && lp);
|
||||
/* flatten image */
|
||||
gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp);
|
||||
/* alpha select */
|
||||
gtk_widget_set_sensitive (layers_ops[12].widget, fs && ac && gimage && lp && alpha);
|
||||
gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lp && alpha);
|
||||
/* mask select */
|
||||
gtk_widget_set_sensitive (layers_ops[13].widget, fs && ac && gimage && lm && lp);
|
||||
gtk_widget_set_sensitive (layers_ops[14].widget, fs && ac && gimage && lm && lp);
|
||||
/* add alpha */
|
||||
gtk_widget_set_sensitive (layers_ops[14].widget, !alpha);
|
||||
gtk_widget_set_sensitive (layers_ops[15].widget, !alpha);
|
||||
|
||||
/* set mode, preserve transparency and opacity to insensitive if there are no layers */
|
||||
gtk_widget_set_sensitive (layersD->preserve_trans, lp);
|
||||
|
@ -1789,6 +1794,20 @@ layers_dialog_merge_layers_callback (GtkWidget *w,
|
|||
layers_dialog_layer_merge_query (gimage, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
layers_dialog_merge_down_callback (GtkWidget *w, gpointer client_data)
|
||||
{
|
||||
GImage *gimage;
|
||||
/* if there is a currently selected gimage
|
||||
*/
|
||||
if (!layersD)
|
||||
return;
|
||||
if (! (gimage = layersD->gimage))
|
||||
return;
|
||||
|
||||
gimp_image_merge_down (gimage, gimage->active_layer, ExpandAsNecessary);
|
||||
gdisplays_flush ();
|
||||
}
|
||||
|
||||
static void
|
||||
layers_dialog_flatten_image_callback (GtkWidget *w,
|
||||
|
@ -3988,3 +4007,4 @@ layers_dialog_layer_merge_query (GImage *gimage,
|
|||
gtk_widget_show (vbox);
|
||||
gtk_widget_show (options->query_box);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue