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:
CDT 1998 Larry Ewing 1998-08-31 21:41:43 +00:00 committed by Larry Ewing
parent eeca444ba3
commit 3c7bb378d7
21 changed files with 606 additions and 41 deletions

View File

@ -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

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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");

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}