gimp-gap r767 - in trunk: . gap



Author: wolfgangh
Date: Sun Jul 13 17:41:41 2008
New Revision: 767
URL: http://svn.gnome.org/viewvc/gimp-gap?rev=767&view=rev

Log:
new feature: viedo extract supports generating transparency via bluebox

Modified:
   trunk/ChangeLog
   trunk/gap/Makefile.am
   trunk/gap/gap_layer_copy.c
   trunk/gap/gap_layer_copy.h
   trunk/gap/gap_mod_layer.c
   trunk/gap/gap_mod_layer.h
   trunk/gap/gap_mod_layer_dialog.c
   trunk/gap/gap_mod_layer_dialog.h
   trunk/gap/gap_vex_dialog.c
   trunk/gap/gap_vex_exec.c
   trunk/gap/gap_vex_main.c
   trunk/gap/gap_vex_main.h

Modified: trunk/gap/Makefile.am
==============================================================================
--- trunk/gap/Makefile.am	(original)
+++ trunk/gap/Makefile.am	Sun Jul 13 17:41:41 2008
@@ -279,6 +279,8 @@
 	gap_libgimpgap.h	
 
 gap_video_extract_SOURCES = \
+	gap_bluebox.c		\
+	gap_bluebox.h		\
 	gap_vex_main.c		\
 	gap_vex_main.h		\
 	gap_vex_exec.c		\

Modified: trunk/gap/gap_layer_copy.c
==============================================================================
--- trunk/gap/gap_layer_copy.c	(original)
+++ trunk/gap/gap_layer_copy.c	Sun Jul 13 17:41:41 2008
@@ -607,3 +607,214 @@
   
   return(layer_id);
 }  /* end gap_layer_flip */
+
+
+
+/* -----------------------------
+ * gap_layer_copy_paste_drawable
+ * -----------------------------
+ * copy specified dst_drawable into src_drawable using
+ * gimp copy paste procedures.
+ * The selection in the specified image will be removed
+ * (e.g. is ignored for copying)
+ * the caller shall specify image_id == -1 in case where selection
+ * shall be respected.
+ */
+void
+gap_layer_copy_paste_drawable(gint32 image_id, gint32 dst_drawable_id, gint32 src_drawable_id)
+{
+  gint32   l_fsel_layer_id;
+  
+  if (image_id >= 0)
+  {
+    gimp_selection_none(image_id);
+  }
+        gimp_edit_copy(src_drawable_id);
+  l_fsel_layer_id = gimp_edit_paste(dst_drawable_id, FALSE);
+  gimp_floating_sel_anchor(l_fsel_layer_id);
+}  /* end gap_layer_copy_paste_drawable */
+
+
+/* ---------------------------------
+ * gap_layer_get_stackposition
+ * ---------------------------------
+ * get stackposition index of the specified layer.
+ * return -1 if the layer is not part of the specified image
+ */
+gint32
+gap_layer_get_stackposition(gint32 image_id, gint32 ref_layer_id)
+{
+  gint          l_nlayers;
+  gint32       *l_layers_list;
+  gint32        l_idx;
+
+  l_layers_list = gimp_image_get_layers(image_id, &l_nlayers);
+  if(l_layers_list != NULL)
+  {
+    for(l_idx = 0; l_idx < l_nlayers; l_idx++)
+    {
+      if(l_layers_list[l_idx] == ref_layer_id)
+      {
+        g_free (l_layers_list);
+        return(l_idx);   
+      }
+    }
+    g_free (l_layers_list);
+  }
+
+  return (-1);
+  
+}  /* end gap_layer_get_stackposition */
+
+
+/* ------------------------
+ * gap_layer_make_duplicate
+ * ------------------------
+ *
+ */
+gint32
+gap_layer_make_duplicate(gint32 src_layer_id, gint32 image_id
+  , const char *name_prefix, const char *name_suffix)
+{  
+  gint32         l_new_layer_id;
+  gint32         l_stackposition;
+  const char    *l_suffix;
+  const char    *l_prefix;
+  char          *l_new_name;
+  char          *l_old_name;
+
+
+  /* make a copy of the layer  */
+  l_new_layer_id = gimp_layer_copy(src_layer_id);
+  
+  /* and add at stackposition above src_layer */
+  l_stackposition = gap_layer_get_stackposition(image_id, src_layer_id);
+  gimp_image_add_layer (image_id, l_new_layer_id, l_stackposition);
+
+  /* build name with optional prefix and/or suffix */  
+  l_suffix = "\0";
+  l_prefix = "\0";
+  if (name_suffix != NULL)
+  {
+    l_suffix = name_suffix;
+  }
+  if (name_prefix != NULL)
+  {
+    l_prefix = name_prefix;
+  }
+  l_old_name = gimp_drawable_get_name(src_layer_id);
+  
+  l_new_name = g_strdup_printf("%s%s%s", l_prefix, l_old_name, l_suffix);
+  
+  gimp_drawable_set_name(l_new_layer_id, l_new_name);
+  g_free(l_old_name);
+  g_free(l_new_name);
+  
+  return (l_new_layer_id);
+}  /* end gap_layer_make_duplicate */
+
+
+
+/* -----------------------------------------------
+ * gap_layer_create_layer_from_layermask
+ * -----------------------------------------------
+ * create a new layer as copy of the layermask of the
+ * specified src_layer_id.
+ * The name is built as copy of the src_layer_id's name
+ * with optional prefix and/or suffix.
+ * (specify NULL to omit name_prefix and/or name_suffix)
+ *
+ * the new layer is added to the image at top
+ * of layerstack
+ * or above the src_layer if src_layer is in the same image.
+ * 
+ * return the id of the newly created layer.
+ */
+gint32
+gap_layer_create_layer_from_layermask(gint32 src_layer_id
+  , gint32 image_id
+  , const char *name_prefix, const char *name_suffix)
+{
+  gboolean       l_has_already_layermask;
+  gint32         l_layermask_id;
+  gint32         l_new_layer_id;
+  gint32         l_new_layermask_id;
+
+  /* make a copy of the layer (but without the layermask) */
+  l_new_layer_id = gap_layer_make_duplicate(src_layer_id, image_id
+    , name_prefix, name_suffix);
+  l_new_layermask_id = gimp_layer_get_mask(l_new_layer_id);
+  if (l_new_layermask_id >= 0)
+  {
+    /* copy the layermask into the new layer */
+    gap_layer_copy_paste_drawable(image_id
+                           , l_new_layer_id      /* dst_drawable_id */
+                           , l_new_layermask_id  /* src_drawable_id */
+                           );
+    gimp_layer_remove_mask (l_new_layer_id, GIMP_MASK_DISCARD);
+  }
+  else
+  {
+    /* create white layer (in case no layermask was present) */
+    gap_layer_clear_to_color(l_new_layer_id
+                              ,1.0 /* red */
+                              ,1.0 /* green  */
+                              ,1.0 /* blue */
+                              ,1.0 /* alpha */
+                              );
+  }
+
+  return (l_new_layer_id);
+}  /* end gap_layer_create_layer_from_layermask */
+
+
+/* ---------------------------------
+ * gap_layer_create_layer_from_alpha
+ * ---------------------------------
+ *
+ */
+gint32
+gap_layer_create_layer_from_alpha(gint32 src_layer_id, gint32 image_id
+  , const char *name_prefix, const char *name_suffix
+  , gboolean applyExistingLayermask, gboolean useTransferAlpha)
+{
+  gint32         l_new_layer_id;
+  gint32         l_old_layermask_id;
+  gint32         l_new_layermask_id;
+
+  /* make a copy of the src_layer */
+  l_new_layer_id = gap_layer_make_duplicate(src_layer_id, image_id
+                           , name_prefix, name_suffix);
+  l_old_layermask_id = gimp_layer_get_mask(l_new_layer_id);
+
+  if (l_old_layermask_id >= 0)
+  {
+    /* handle already exiting layermask: apply or remove (e.g. ignore) */
+    if (applyExistingLayermask)
+    {
+       /* merge the already existing layermask into the alpha channel */
+       gimp_layer_remove_mask (l_new_layer_id, GIMP_MASK_APPLY);
+    }
+    else
+    {
+       gimp_layer_remove_mask (l_new_layer_id, GIMP_MASK_DISCARD);
+    }
+  }
+
+  /* create a new layermask from the alpha channel */
+  if (useTransferAlpha == TRUE)
+  {
+          l_new_layermask_id = gimp_layer_create_mask(l_new_layer_id, GIMP_ADD_ALPHA_TRANSFER_MASK);
+  }
+  else
+  {
+          l_new_layermask_id = gimp_layer_create_mask(l_new_layer_id, GIMP_ADD_ALPHA_MASK);
+  }
+
+
+  gimp_layer_add_mask(l_new_layer_id, l_new_layermask_id);
+  gap_layer_copy_paste_drawable(image_id, l_new_layer_id, l_new_layermask_id);
+  gimp_layer_remove_mask (l_new_layer_id, GIMP_MASK_DISCARD);
+  return (l_new_layer_id);
+
+}  /* end gap_layer_create_layer_from_alpha  */

Modified: trunk/gap/gap_layer_copy.h
==============================================================================
--- trunk/gap/gap_layer_copy.h	(original)
+++ trunk/gap/gap_layer_copy.h	Sun Jul 13 17:41:41 2008
@@ -74,4 +74,22 @@
 
 gint32 gap_layer_flip(gint32 layer_id, gint32 flip_request);
 
+
+
+void   gap_layer_copy_paste_drawable(gint32 image_id, gint32 dst_drawable_id, gint32 src_drawable_id);
+
+gint32 gap_layer_get_stackposition(gint32 image_id, gint32 ref_layer_id);
+
+
+gint32  gap_layer_make_duplicate(gint32 src_layer_id, gint32 image_id
+                                , const char *name_prefix, const char *name_suffix);
+
+gint32  gap_layer_create_layer_from_layermask(gint32 src_layer_id
+                               , gint32 image_id
+                               , const char *name_prefix, const char *name_suffix);
+
+gint32  gap_layer_create_layer_from_alpha(gint32 src_layer_id, gint32 image_id
+                               , const char *name_prefix, const char *name_suffix
+                               , gboolean applyExistingLayermask, gboolean useTransferAlpha);
+
 #endif

Modified: trunk/gap/gap_mod_layer.c
==============================================================================
--- trunk/gap/gap_mod_layer.c	(original)
+++ trunk/gap/gap_mod_layer.c	Sun Jul 13 17:41:41 2008
@@ -130,13 +130,13 @@
      l_msg = g_strdup_printf ( _("Non-Interactive call of %s\n(for all selected layers)"), filter_procname);
   }
   l_continue = gap_arr_std_dialog ( _("Animated Filter Apply"), l_msg,
-  				   l_argc,     l_argv,
-  				   l_but_argc, l_but_argv, 0);
+                                   l_argc,     l_argv,
+                                   l_but_argc, l_but_argv, 0);
   g_free (l_msg);
 
   return (l_continue);
 
-}	/* end p_pitstop_dialog */
+}       /* end p_pitstop_dialog */
 
 
 /* ---------------------------------
@@ -167,10 +167,10 @@
       if(l_layers_list[l_idx] == ref_layer_id)
       {
         l_nb_idx = l_idx + nb_ref;
-	if((l_nb_idx >= 0) && (l_nb_idx < l_nlayers))
-	{
-	  l_nb_layer_id = l_layers_list[l_nb_idx];
-	}
+        if((l_nb_idx >= 0) && (l_nb_idx < l_nlayers))
+        {
+          l_nb_layer_id = l_layers_list[l_nb_idx];
+        }
         break;
       }
     }
@@ -202,7 +202,7 @@
     }
   }
   return(-1);
-}	/* end gap_mod_get_1st_selected */
+}       /* end gap_mod_get_1st_selected */
 
 
 /* ============================================================================
@@ -216,7 +216,7 @@
 gap_mod_alloc_layli(gint32 image_id, gint32 *l_sel_cnt, gint *nlayers,
               gint32 sel_mode,
               gint32 sel_case,
-	      gint32 sel_invert,
+              gint32 sel_invert,
               char *sel_pattern )
 {
   gint32 *l_layers_list;
@@ -249,24 +249,24 @@
     l_layli_ptr[l_idx].selected  = gap_match_layer(l_idx,
                                                  l_layername,
                                                  sel_pattern,
-						 sel_mode,
-						 sel_case,
-						 sel_invert,
-						 *nlayers, l_layer_id);
+                                                 sel_mode,
+                                                 sel_case,
+                                                 sel_invert,
+                                                 *nlayers, l_layer_id);
     if(l_layli_ptr[l_idx].selected != FALSE)
     {
       (*l_sel_cnt)++;  /* count all selected layers */
     }
     if(gap_debug) printf("gap: gap_mod_alloc_layli [%d] id:%d, sel:%d name:%s:\n",
                          (int)l_idx, (int)l_layer_id,
-			 (int)l_layli_ptr[l_idx].selected, l_layername);
+                         (int)l_layli_ptr[l_idx].selected, l_layername);
     g_free (l_layername);
   }
 
   g_free (l_layers_list);
 
   return( l_layli_ptr );
-}		/* end gap_mod_alloc_layli */
+}               /* end gap_mod_alloc_layli */
 
 
 /* ============================================================================
@@ -286,7 +286,7 @@
     gimp_layer_add_alpha(layer_id);
   }
   gimp_image_raise_layer(image_id, layer_id);
-}	/* end p_raise_layer */
+}       /* end p_raise_layer */
 
 static void
 p_lower_layer (gint32 image_id, gint32 layer_id, GapModLayliElem * layli_ptr, gint nlayers)
@@ -311,7 +311,7 @@
   }
 
   gimp_image_lower_layer(image_id, layer_id);
-}	/* end p_lower_layer */
+}       /* end p_lower_layer */
 
 
 /* ============================================================================
@@ -323,8 +323,8 @@
 static void
 p_selection_combine(gint32 image_id
                    ,gint32 master_channel_id
-		   ,GimpChannelOps  operation
-		   )
+                   ,GimpChannelOps  operation
+                   )
 {
   gint32   l_new_channel_id;
   gint32   l_sel_channel_id;
@@ -337,13 +337,13 @@
    */
   gap_layer_copy_content( l_new_channel_id      /* dst_drawable_id  */
                         , master_channel_id   /* src_drawable_id  */
-			);
+                        );
   gimp_channel_combine_masks(l_sel_channel_id
                             ,l_new_channel_id
-			    ,operation
-			    , 0
-			    , 0
-			    );
+                            ,operation
+                            , 0
+                            , 0
+                            );
   gimp_drawable_delete(l_new_channel_id);
 
 }  /* end p_selection_combine */
@@ -465,18 +465,18 @@
  */
 static int
 p_apply_action(gint32 image_id,
-	      gint32 action_mode,
-	      GapModLayliElem *layli_ptr,
-	      gint nlayers,
-	      gint32 sel_cnt,
-
-	      long  from,
-	      long  to,
-	      long  curr,
-	      char *new_layername,
-	      char *filter_procname,
-	      gint32 master_image_id
-	      )
+              gint32 action_mode,
+              GapModLayliElem *layli_ptr,
+              gint nlayers,
+              gint32 sel_cnt,
+
+              long  from,
+              long  to,
+              long  curr,
+              char *new_layername,
+              char *filter_procname,
+              gint32 master_image_id
+              )
 {
   int   l_idx;
   int   l_rc;
@@ -507,8 +507,8 @@
     master_channel_id = gimp_image_get_selection(master_image_id);
     action_was_applied = p_apply_selection_action(image_id 
                                                 , action_mode
-					        , master_image_id
-						, master_channel_id
+                                                , master_image_id
+                                                , master_channel_id
                                                 );
     if(action_was_applied)
     {
@@ -537,12 +537,12 @@
        else
        {
           if(gimp_drawable_get_visible(layli_ptr[l_idx].layer_id))
-	  {
-	    /* result will we visible if at least one of the
-	     * selected layers was visible before
-	     */
-	    l_vis_result = TRUE;
-	  }
+          {
+            /* result will we visible if at least one of the
+             * selected layers was visible before
+             */
+            l_vis_result = TRUE;
+          }
           gimp_drawable_set_visible(layli_ptr[l_idx].layer_id, TRUE);
        }
      }
@@ -559,9 +559,9 @@
       */
      if (!gap_match_string_is_empty (new_layername))
      {
-	 gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                      new_layername, curr);
-	 gimp_drawable_set_name(l_layer_id, &l_name_buff[0]);
+         gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                              new_layername, curr);
+         gimp_drawable_set_name(l_layer_id, &l_name_buff[0]);
      }
 
      /* restore visibility flags after merge */
@@ -592,57 +592,57 @@
       {
         case GAP_MOD_ACM_SET_VISIBLE:
           gimp_drawable_set_visible(l_layer_id, TRUE);
-	  break;
+          break;
         case GAP_MOD_ACM_SET_INVISIBLE:
           gimp_drawable_set_visible(l_layer_id, FALSE);
-	  break;
+          break;
         case GAP_MOD_ACM_SET_LINKED:
           gimp_drawable_set_linked(l_layer_id, TRUE);
-	  break;
+          break;
         case GAP_MOD_ACM_SET_UNLINKED:
           gimp_drawable_set_linked(l_layer_id, FALSE);
-	  break;
+          break;
         case GAP_MOD_ACM_RAISE:
-	  p_raise_layer(image_id, l_layer_id, layli_ptr, nlayers);
-	  break;
+          p_raise_layer(image_id, l_layer_id, layli_ptr, nlayers);
+          break;
         case GAP_MOD_ACM_LOWER:
-	  p_lower_layer(image_id, l_layer_id, layli_ptr, nlayers);
-	  break;
+          p_lower_layer(image_id, l_layer_id, layli_ptr, nlayers);
+          break;
         case GAP_MOD_ACM_APPLY_FILTER:
-	  l_rc = gap_filt_pdb_call_plugin(filter_procname,
-	                       image_id,
-			       l_layer_id,
-			       GIMP_RUN_WITH_LAST_VALS);
+          l_rc = gap_filt_pdb_call_plugin(filter_procname,
+                               image_id,
+                               l_layer_id,
+                               GIMP_RUN_WITH_LAST_VALS);
           if(gap_debug) printf("gap: p_apply_action FILTER:%s rc =%d\n",
                                 filter_procname, (int)l_rc);
-	  break;
+          break;
         case GAP_MOD_ACM_APPLY_FILTER_ON_LAYERMASK:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    l_rc = gap_filt_pdb_call_plugin(filter_procname,
-	                       image_id,
-			       gimp_layer_get_mask(l_layer_id),
-			       GIMP_RUN_WITH_LAST_VALS);
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            l_rc = gap_filt_pdb_call_plugin(filter_procname,
+                               image_id,
+                               gimp_layer_get_mask(l_layer_id),
+                               GIMP_RUN_WITH_LAST_VALS);
           }
-	  break;
+          break;
         case GAP_MOD_ACM_DUPLICATE:
-	  l_new_layer_id = gimp_layer_copy(l_layer_id);
-	  gimp_image_add_layer (image_id, l_new_layer_id, -1);
-	  if (!gap_match_string_is_empty (new_layername))
-	  {
-	      gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                           new_layername, curr);
-	      gimp_drawable_set_name(l_new_layer_id, &l_name_buff[0]);
-	  }
-	  break;
+          l_new_layer_id = gimp_layer_copy(l_layer_id);
+          gimp_image_add_layer (image_id, l_new_layer_id, -1);
+          if (!gap_match_string_is_empty (new_layername))
+          {
+              gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                                   new_layername, curr);
+              gimp_drawable_set_name(l_new_layer_id, &l_name_buff[0]);
+          }
+          break;
         case GAP_MOD_ACM_DELETE:
-	  gimp_image_remove_layer(image_id, l_layer_id);
-	  break;
+          gimp_image_remove_layer(image_id, l_layer_id);
+          break;
         case GAP_MOD_ACM_RENAME:
-	  gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                        new_layername, curr);
-	  gimp_drawable_set_name(l_layer_id, &l_name_buff[0]);
-	  break;
+          gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                                new_layername, curr);
+          gimp_drawable_set_name(l_layer_id, &l_name_buff[0]);
+          break;
 
         case GAP_MOD_ACM_SEL_ALPHA:
           if(gimp_drawable_has_alpha(l_layer_id))
@@ -658,288 +658,322 @@
 
         case GAP_MOD_ACM_SEL_SAVE:
           {
-	    gint32 l_sel_channel_id;
-	    l_sel_channel_id = gimp_selection_save(image_id);
+            gint32 l_sel_channel_id;
+            l_sel_channel_id = gimp_selection_save(image_id);
             if(*new_layername != '\0')
-	    {
-	      gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                                   new_layername, curr);
-	      gimp_drawable_set_name(l_sel_channel_id, &l_name_buff[0]);
-	    }
-	  }
-	  break;
+            {
+              gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                                           new_layername, curr);
+              gimp_drawable_set_name(l_sel_channel_id, &l_name_buff[0]);
+            }
+          }
+          break;
         case GAP_MOD_ACM_SEL_LOAD:
           {
             if(*new_layername != '\0')
-	    {
-	      gint   *l_channels;
-	      gint    n_channels;
-	      gint    l_ii;
-	      gchar  *l_channelname;
-
-	      gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                                   new_layername, curr);
-
-	      l_channels = gimp_image_get_channels(image_id, &n_channels);
-	      for(l_ii=0; l_ii < n_channels; l_ii++)
-	      {
-	        l_channelname = gimp_drawable_get_name(l_channels[l_ii]);
-		if(l_channelname)
-		{
-		  if(strcmp(l_channelname,&l_name_buff[0] ) == 0)
-		  {
+            {
+              gint   *l_channels;
+              gint    n_channels;
+              gint    l_ii;
+              gchar  *l_channelname;
+
+              gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                                           new_layername, curr);
+
+              l_channels = gimp_image_get_channels(image_id, &n_channels);
+              for(l_ii=0; l_ii < n_channels; l_ii++)
+              {
+                l_channelname = gimp_drawable_get_name(l_channels[l_ii]);
+                if(l_channelname)
+                {
+                  if(strcmp(l_channelname,&l_name_buff[0] ) == 0)
+                  {
                     gimp_selection_load(l_channels[l_ii]);
-		    g_free(l_channelname);
-		    break;
-		  }
-		  g_free(l_channelname);
-		}
-	      }
-	      if(l_channels)
-	      {
-	        g_free(l_channels);
-	      }
-	    }
-	  }
-	  break;
+                    g_free(l_channelname);
+                    break;
+                  }
+                  g_free(l_channelname);
+                }
+              }
+              if(l_channels)
+              {
+                g_free(l_channels);
+              }
+            }
+          }
+          break;
         case GAP_MOD_ACM_SEL_DELETE:
           {
             if(*new_layername != '\0')
-	    {
-	      gint   *l_channels;
-	      gint    n_channels;
-	      gint    l_ii;
-	      gchar  *l_channelname;
-
-	      gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
-	                                   new_layername, curr);
-
-	      l_channels = gimp_image_get_channels(image_id, &n_channels);
-	      for(l_ii=0; l_ii < n_channels; l_ii++)
-	      {
-	        l_channelname = gimp_drawable_get_name(l_channels[l_ii]);
-		if(l_channelname)
-		{
-		  if(strcmp(l_channelname,&l_name_buff[0] ) == 0)
-		  {
+            {
+              gint   *l_channels;
+              gint    n_channels;
+              gint    l_ii;
+              gchar  *l_channelname;
+
+              gap_match_substitute_framenr(&l_name_buff[0], sizeof(l_name_buff),
+                                           new_layername, curr);
+
+              l_channels = gimp_image_get_channels(image_id, &n_channels);
+              for(l_ii=0; l_ii < n_channels; l_ii++)
+              {
+                l_channelname = gimp_drawable_get_name(l_channels[l_ii]);
+                if(l_channelname)
+                {
+                  if(strcmp(l_channelname,&l_name_buff[0] ) == 0)
+                  {
                     gimp_image_remove_channel(image_id, l_channels[l_ii]);
-		  }
-		  g_free(l_channelname);
-		}
-	      }
-	      if(l_channels)
-	      {
-	        g_free(l_channels);
-	      }
-	    }
-	  }
-	  break;
+                  }
+                  g_free(l_channelname);
+                }
+              }
+              if(l_channels)
+              {
+                g_free(l_channels);
+              }
+            }
+          }
+          break;
         case GAP_MOD_ACM_ADD_ALPHA:
-	  if(!gimp_drawable_has_alpha(l_layer_id))
-	  {
-	    gimp_layer_add_alpha(l_layer_id);
-	  }
-	  break;
+          if(!gimp_drawable_has_alpha(l_layer_id))
+          {
+            gimp_layer_add_alpha(l_layer_id);
+          }
+          break;
         case GAP_MOD_ACM_LMASK_WHITE:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_WHITE_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_WHITE_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_BLACK:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_BLACK_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_BLACK_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_ALPHA:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_ALPHA_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_ALPHA_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_TALPHA:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_ALPHA_TRANSFER_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_ALPHA_TRANSFER_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_SEL:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_SELECTION_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_SELECTION_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_BWCOPY:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_COPY_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_COPY_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          break;
         case GAP_MOD_ACM_LMASK_DELETE:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_DISCARD);
-	  }
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_DISCARD);
+          }
+          break;
         case GAP_MOD_ACM_LMASK_APPLY:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  break;
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          break;
         case GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK:
         case GAP_MOD_ACM_LMASK_COPY_FROM_LOWER_LMASK:
-	  /* create black mask per default */
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
-	  }
-	  l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_BLACK_MASK);
-	  gimp_layer_add_mask(l_layer_id, l_layermask_id);
-	  /* get layermask_id from upper neigbour layer (if there is any) */
-	  if(l_layermask_id >= 0)
-	  {
-	    gint32 l_nb_mask_id;
-	    gint32 l_nb_layer_id;
-	    gint32 l_nb_ref;
-	    gint32 l_fsel_layer_id;
-	    gint32 l_nb_had_layermask;
-	    
-	    l_nb_ref = 1;
+          /* create black mask per default */
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_layer_remove_mask (l_layer_id, GIMP_MASK_APPLY);
+          }
+          l_layermask_id = gimp_layer_create_mask(l_layer_id, GIMP_ADD_BLACK_MASK);
+          gimp_layer_add_mask(l_layer_id, l_layermask_id);
+          /* get layermask_id from upper neigbour layer (if there is any) */
+          if(l_layermask_id >= 0)
+          {
+            gint32 l_nb_mask_id;
+            gint32 l_nb_layer_id;
+            gint32 l_nb_ref;
+            gint32 l_fsel_layer_id;
+            gint32 l_nb_had_layermask;
+            
+            l_nb_ref = 1;
             if(action_mode == GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK)
-	    {
-	      l_nb_ref = -1;
-	    }
-	    l_nb_layer_id = p_get_nb_layer_id(image_id, l_layer_id, l_nb_ref);
-	    if(l_nb_layer_id >= 0)
-	    {
-	      l_nb_mask_id = gimp_layer_get_mask(l_nb_layer_id);
-	      l_nb_had_layermask = TRUE;
-	      if(l_nb_mask_id < 0)
-	      {
-	        /* the referenced neigbour layer had no layermask
-		 * in this case we create one as bw-copy temporary
-		 */
-	        l_nb_had_layermask = FALSE;
-		l_nb_mask_id = gimp_layer_create_mask(l_nb_layer_id, GIMP_ADD_COPY_MASK);
-	        gimp_layer_add_mask(l_nb_layer_id, l_nb_mask_id);
-	      }
-	      
-	      if(l_nb_mask_id >= 0)
-	      {
-	        /* the referenced neigbour layer has a layermask
-		 * we can copy from this mask now
-		 */
-		gimp_selection_none(image_id);
-		gimp_edit_copy(l_nb_mask_id);
-		l_fsel_layer_id = gimp_edit_paste(l_layermask_id, FALSE);
-		gimp_floating_sel_anchor(l_fsel_layer_id);
-		
-		if(l_nb_had_layermask == FALSE)
-		{
-		  /* remove the temporary created layermask in the neigbour layer */
-		  gimp_layer_remove_mask (l_nb_layer_id, GIMP_MASK_DISCARD);
-		}
-	      }
-	    }
-	  }
-	  break;
-	case GAP_MOD_ACM_LMASK_INVERT:
-	  if(gimp_layer_get_mask(l_layer_id) >= 0)
-	  {
-	    gimp_invert(gimp_layer_get_mask(l_layer_id));
-	  }
-	  break;
-	case GAP_MOD_ACM_SET_MODE_NORMAL: 
-	  gimp_layer_set_mode(l_layer_id, GIMP_NORMAL_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_DISSOLVE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_DISSOLVE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_MULTIPLY:
-	  gimp_layer_set_mode(l_layer_id, GIMP_MULTIPLY_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_DIVIDE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_DIVIDE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_SCREEN:
-	  gimp_layer_set_mode(l_layer_id, GIMP_SCREEN_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_OVERLAY:
-	  gimp_layer_set_mode(l_layer_id, GIMP_OVERLAY_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_DIFFERENCE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_DIFFERENCE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_ADDITION:
-	  gimp_layer_set_mode(l_layer_id, GIMP_ADDITION_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_SUBTRACT:
-	  gimp_layer_set_mode(l_layer_id, GIMP_SUBTRACT_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_DARKEN_ONLY:
-	  gimp_layer_set_mode(l_layer_id, GIMP_DARKEN_ONLY_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_LIGHTEN_ONLY:
-	  gimp_layer_set_mode(l_layer_id, GIMP_LIGHTEN_ONLY_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_DODGE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_DODGE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_BURN:
-	  gimp_layer_set_mode(l_layer_id, GIMP_BURN_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_HARDLIGHT:
-	  gimp_layer_set_mode(l_layer_id, GIMP_HARDLIGHT_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_SOFTLIGHT:
-	  gimp_layer_set_mode(l_layer_id, GIMP_SOFTLIGHT_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_COLOR_ERASE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_COLOR_ERASE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_GRAIN_EXTRACT_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_GRAIN_EXTRACT_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_GRAIN_MERGE_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_GRAIN_MERGE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_HUE_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_HUE_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_SATURATION_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_SATURATION_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_COLOR_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_COLOR_MODE);
-	  break;
-	case GAP_MOD_ACM_SET_MODE_VALUE_MODE:
-	  gimp_layer_set_mode(l_layer_id, GIMP_VALUE_MODE);
-	  break;
+            {
+              l_nb_ref = -1;
+            }
+            l_nb_layer_id = p_get_nb_layer_id(image_id, l_layer_id, l_nb_ref);
+            if(l_nb_layer_id >= 0)
+            {
+              l_nb_mask_id = gimp_layer_get_mask(l_nb_layer_id);
+              l_nb_had_layermask = TRUE;
+              if(l_nb_mask_id < 0)
+              {
+                /* the referenced neigbour layer had no layermask
+                 * in this case we create one as bw-copy temporary
+                 */
+                l_nb_had_layermask = FALSE;
+                l_nb_mask_id = gimp_layer_create_mask(l_nb_layer_id, GIMP_ADD_COPY_MASK);
+                gimp_layer_add_mask(l_nb_layer_id, l_nb_mask_id);
+              }
+              
+              if(l_nb_mask_id >= 0)
+              {
+                /* the referenced neigbour layer has a layermask
+                 * we can copy from this mask now
+                 */
+                gimp_selection_none(image_id);
+                gimp_edit_copy(l_nb_mask_id);
+                l_fsel_layer_id = gimp_edit_paste(l_layermask_id, FALSE);
+                gimp_floating_sel_anchor(l_fsel_layer_id);
+                
+                if(l_nb_had_layermask == FALSE)
+                {
+                  /* remove the temporary created layermask in the neigbour layer */
+                  gimp_layer_remove_mask (l_nb_layer_id, GIMP_MASK_DISCARD);
+                }
+              }
+            }
+          }
+          break;
+        case GAP_MOD_ACM_LMASK_INVERT:
+          if(gimp_layer_get_mask(l_layer_id) >= 0)
+          {
+            gimp_invert(gimp_layer_get_mask(l_layer_id));
+          }
+          break;
+        case GAP_MOD_ACM_CREATE_LAYER_FROM_OPACITY:
+          /* create a mask layer that represents current opacity
+           * (including both the alpha channel and layermask (if exists)
+           */
+          gap_layer_create_layer_from_alpha(l_layer_id
+                                               , image_id
+                                               , NULL        /* name_prefix */
+                                               , _("_msk")   /* name suffix */
+                                               , TRUE        /* applyExistingLayermask */
+                                               , FALSE       /* useTransferAlpha */
+                                               );
+          break;
+        case GAP_MOD_ACM_CREATE_LAYER_FROM_ALPHA:
+          /* create a mask layer that is a copy of the the alpha channel
+           * (ignores an existing layermask)
+           */
+          gap_layer_create_layer_from_alpha(l_layer_id
+                                               , image_id
+                                               , NULL        /* name_prefix */
+                                               , _("_msk")   /* name suffix */
+                                               , FALSE       /* applyExistingLayermask */
+                                               , FALSE       /* useTransferAlpha */
+                                               );
+          break;
+        case GAP_MOD_ACM_CREATE_LAYER_FROM_LMASK:
+          /* create a mask layer that is a copy of the layermask
+           * (ignores the alpha channel)
+           */
+          gap_layer_create_layer_from_layermask(l_layer_id
+                                               , image_id
+                                               , NULL        /* name_prefix */
+                                               , _("_msk")   /* name suffix */
+                                               );
+          break;
+        case GAP_MOD_ACM_SET_MODE_NORMAL: 
+          gimp_layer_set_mode(l_layer_id, GIMP_NORMAL_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_DISSOLVE:
+          gimp_layer_set_mode(l_layer_id, GIMP_DISSOLVE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_MULTIPLY:
+          gimp_layer_set_mode(l_layer_id, GIMP_MULTIPLY_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_DIVIDE:
+          gimp_layer_set_mode(l_layer_id, GIMP_DIVIDE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_SCREEN:
+          gimp_layer_set_mode(l_layer_id, GIMP_SCREEN_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_OVERLAY:
+          gimp_layer_set_mode(l_layer_id, GIMP_OVERLAY_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_DIFFERENCE:
+          gimp_layer_set_mode(l_layer_id, GIMP_DIFFERENCE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_ADDITION:
+          gimp_layer_set_mode(l_layer_id, GIMP_ADDITION_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_SUBTRACT:
+          gimp_layer_set_mode(l_layer_id, GIMP_SUBTRACT_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_DARKEN_ONLY:
+          gimp_layer_set_mode(l_layer_id, GIMP_DARKEN_ONLY_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_LIGHTEN_ONLY:
+          gimp_layer_set_mode(l_layer_id, GIMP_LIGHTEN_ONLY_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_DODGE:
+          gimp_layer_set_mode(l_layer_id, GIMP_DODGE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_BURN:
+          gimp_layer_set_mode(l_layer_id, GIMP_BURN_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_HARDLIGHT:
+          gimp_layer_set_mode(l_layer_id, GIMP_HARDLIGHT_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_SOFTLIGHT:
+          gimp_layer_set_mode(l_layer_id, GIMP_SOFTLIGHT_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_COLOR_ERASE:
+          gimp_layer_set_mode(l_layer_id, GIMP_COLOR_ERASE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_GRAIN_EXTRACT_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_GRAIN_EXTRACT_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_GRAIN_MERGE_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_GRAIN_MERGE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_HUE_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_HUE_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_SATURATION_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_SATURATION_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_COLOR_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_COLOR_MODE);
+          break;
+        case GAP_MOD_ACM_SET_MODE_VALUE_MODE:
+          gimp_layer_set_mode(l_layer_id, GIMP_VALUE_MODE);
+          break;
         case GAP_MOD_ACM_RESIZE_TO_IMG:
           gimp_layer_resize_to_image_size (l_layer_id);
-	  break;
+          break;
         default:
-	  break;
+          break;
       }
     }
   }
 
   return (l_rc);
-}	/* end p_apply_action */
+}       /* end p_apply_action */
 
 
 /* ============================================================================
@@ -955,10 +989,10 @@
                     gint32 image_id, gint32 *dpy_id,
                     GapModLayliElem * layli_ptr, gint nlayers ,
                     char *filter_procname, int filt_len,
-		    gint *plugin_data_len,
-		    GapFiltPdbApplyMode *apply_mode,
-		    gboolean operate_on_layermask
-		    )
+                    gint *plugin_data_len,
+                    GapFiltPdbApplyMode *apply_mode,
+                    gboolean operate_on_layermask
+                    )
 {
   GapDbBrowserResult  l_browser_result;
   gint32   l_drawable_id;
@@ -976,8 +1010,8 @@
                             gap_filt_pdb_constraint_proc_sel1,
                             gap_filt_pdb_constraint_proc_sel2,
                             &l_browser_result,
-			    image_id,
-			    GAP_DB_BROWSER_MODFRAMES_HELP_ID) < 0)
+                            image_id,
+                            GAP_DB_BROWSER_MODFRAMES_HELP_ID) < 0)
   {
       if(gap_debug) printf("DEBUG: gap_db_browser_dialog cancelled\n");
       return -1;
@@ -1052,7 +1086,7 @@
   }
 
   return(0);
-}	/* end p_do_filter_dialogs */
+}       /* end p_do_filter_dialogs */
 
 
 /* ============================================================================
@@ -1071,10 +1105,10 @@
 static gint
 p_do_2nd_filter_dialogs(char *filter_procname,
                         GapFiltPdbApplyMode  l_apply_mode,
-			char *last_frame_filename,
-			gint32 sel_mode, gint32 sel_case,
-			gint32 sel_invert, char *sel_pattern,
-			gboolean operate_on_layermask
+                        char *last_frame_filename,
+                        gint32 sel_mode, gint32 sel_case,
+                        gint32 sel_invert, char *sel_pattern,
+                        gboolean operate_on_layermask
                        )
 {
   gint32   l_drawable_id;
@@ -1130,8 +1164,8 @@
     if(l_drawable_id < 0)
     {
       g_message (_("Modify Layers cancelled: first selected layer \"%s\"\nin last frame has no layermask"),
-	            gimp_drawable_get_name(l_layli_ptr[l_idx].layer_id)
-		    );
+                    gimp_drawable_get_name(l_layli_ptr[l_idx].layer_id)
+                    );
       goto cleanup;
     }
   }
@@ -1175,7 +1209,7 @@
   return (l_rc);
 
 
-}	/* end p_do_2nd_filter_dialogs */
+}       /* end p_do_2nd_filter_dialogs */
 
 
 /* ============================================================================
@@ -1330,15 +1364,15 @@
       {
         gint l_ii;
 
-	l_operate_on_layermask = TRUE;
-	l_ii = gap_mod_get_1st_selected(l_layli_ptr, l_nlayers);
-	if(gimp_layer_get_mask(l_layli_ptr[l_ii].layer_id) < 0)
-	{
+        l_operate_on_layermask = TRUE;
+        l_ii = gap_mod_get_1st_selected(l_layli_ptr, l_nlayers);
+        if(gimp_layer_get_mask(l_layli_ptr[l_ii].layer_id) < 0)
+        {
           g_message(_("first selected layer \"%s\"\nin start frame has no layermask"),
-	            gimp_drawable_get_name(l_layli_ptr[l_ii].layer_id)
-		    );
+                    gimp_drawable_get_name(l_layli_ptr[l_ii].layer_id)
+                    );
           goto error;
-	}
+        }
       }
 
       if(l_begin != l_end)
@@ -1360,20 +1394,20 @@
                                  l_layli_ptr, l_nlayers,
                                 &l_filter_procname[0], sizeof(l_filter_procname),
                                 &l_plugin_data_len,
-				&l_apply_mode,
-				 l_operate_on_layermask
-				 );
+                                &l_apply_mode,
+                                 l_operate_on_layermask
+                                 );
 
       if(l_last_frame_filename != NULL)
       {
         if((l_rc == 0) && (l_apply_mode == GAP_PAPP_VARYING_LINEAR))
-	{
+        {
           l_rc = p_do_2nd_filter_dialogs(&l_filter_procname[0],
-				   l_apply_mode,
-				   l_last_frame_filename,
-				   sel_mode, sel_case, sel_invert, sel_pattern,
-				   l_operate_on_layermask
-				  );
+                                   l_apply_mode,
+                                   l_last_frame_filename,
+                                   sel_mode, sel_case, sel_invert, sel_pattern,
+                                   l_operate_on_layermask
+                                  );
         }
 
         g_free(l_last_frame_filename);
@@ -1404,15 +1438,15 @@
 
     /* perform function (defined by action_mode) on selcted layer(s) */
     l_rc = p_apply_action(l_tmp_image_id,
-		   action_mode,
-		   l_layli_ptr,
-		   l_nlayers,
-		   l_sel_cnt,
-		   l_begin, l_end, l_cur_frame_nr,
-		   new_layername,
-		   &l_filter_procname[0],
-		   ainfo_ptr->image_id     /* MASTER_image_id */
-		   );
+                   action_mode,
+                   l_layli_ptr,
+                   l_nlayers,
+                   l_sel_cnt,
+                   l_begin, l_end, l_cur_frame_nr,
+                   new_layername,
+                   &l_filter_procname[0],
+                   ainfo_ptr->image_id     /* MASTER_image_id */
+                   );
     if(l_rc != 0)
     {
       if(gap_debug) printf("gap: p_frames_modify p_apply-action failed. rc=%d\n", (int)l_rc);
@@ -1447,27 +1481,27 @@
          * the plugin's last_values
          */
        if(gap_debug) printf("DEBUG: calling iterator %s  current frame:%d\n",
-        		       l_plugin_iterator, (int)l_cur_frame_nr);
+                               l_plugin_iterator, (int)l_cur_frame_nr);
        if(strcmp(l_plugin_iterator, GIMP_PLUGIN_GAP_COMMON_ITER) == 0)
        {
          l_params = gimp_run_procedure (l_plugin_iterator,
-		           &l_retvals,
-		           GIMP_PDB_INT32,   GIMP_RUN_NONINTERACTIVE,
-		           GIMP_PDB_INT32,   l_total_steps,      /* total steps  */
-		           GIMP_PDB_FLOAT,   (gdouble)l_cur_step,    /* current step */
-		           GIMP_PDB_INT32,   l_plugin_data_len, /* length of stored data struct */
+                           &l_retvals,
+                           GIMP_PDB_INT32,   GIMP_RUN_NONINTERACTIVE,
+                           GIMP_PDB_INT32,   l_total_steps,      /* total steps  */
+                           GIMP_PDB_FLOAT,   (gdouble)l_cur_step,    /* current step */
+                           GIMP_PDB_INT32,   l_plugin_data_len, /* length of stored data struct */
                            GIMP_PDB_STRING,  &l_filter_procname[0],       /* the common iterator needs the plugin name as additional param */
-			   GIMP_PDB_END);
+                           GIMP_PDB_END);
        }
        else
        {
          l_params = gimp_run_procedure (l_plugin_iterator,
-	  		     &l_retvals,
-	  		     GIMP_PDB_INT32,   GIMP_RUN_NONINTERACTIVE,
-	  		     GIMP_PDB_INT32,   l_total_steps,          /* total steps  */
-	  		     GIMP_PDB_FLOAT,   (gdouble)l_cur_step,    /* current step */
-	  		     GIMP_PDB_INT32,   l_plugin_data_len, /* length of stored data struct */
-	  		     GIMP_PDB_END);
+                             &l_retvals,
+                             GIMP_PDB_INT32,   GIMP_RUN_NONINTERACTIVE,
+                             GIMP_PDB_INT32,   l_total_steps,          /* total steps  */
+                             GIMP_PDB_FLOAT,   (gdouble)l_cur_step,    /* current step */
+                             GIMP_PDB_INT32,   l_plugin_data_len, /* length of stored data struct */
+                             GIMP_PDB_END);
        }
        if (l_params[0].data.d_status != GIMP_PDB_SUCCESS)
        {
@@ -1509,7 +1543,7 @@
        break;
     l_cur_frame_nr += l_step;
 
-  }		/* end while(1)  loop foreach frame in range */
+  }             /* end while(1)  loop foreach frame in range */
 
   /* check if master image is included in the affected range */
   if ((ainfo_ptr->curr_frame_nr >= MIN(range_from, range_to))
@@ -1527,15 +1561,15 @@
 
        /* create a temporary copy of the selection
         * (because add the selections to itself
-	*  behaves different when there are partly selected pixel
-	*  than using a copy)
-	*/
+        *  behaves different when there are partly selected pixel
+        *  than using a copy)
+        */
        master_channel_id = gimp_selection_save(ainfo_ptr->image_id);
        p_apply_selection_action(ainfo_ptr->image_id 
-                	     , action_mode
-			     , -1   /* MASTER_image_id */
-			     , master_channel_id
-                	     );
+                             , action_mode
+                             , -1   /* MASTER_image_id */
+                             , master_channel_id
+                             );
        gimp_image_remove_channel(ainfo_ptr->image_id, master_channel_id);
     }
   }
@@ -1560,7 +1594,7 @@
   if(l_plugin_iterator != NULL)  g_free(l_plugin_iterator);
   return -1;
 
-}		/* end p_frames_modify */
+}               /* end p_frames_modify */
 
 
 /* ============================================================================
@@ -1598,38 +1632,38 @@
       if(run_mode == GIMP_RUN_INTERACTIVE)
       {
          l_rc = gap_mod_frames_dialog (ainfo_ptr, &l_from, &l_to,
-	                               &l_action_mode,
-				       &l_sel_mode, &sel_case, &sel_invert,
-				       &l_sel_pattern[0], &l_new_layername[0]);
+                                       &l_action_mode,
+                                       &l_sel_mode, &sel_case, &sel_invert,
+                                       &l_sel_pattern[0], &l_new_layername[0]);
       }
       else
       {
          l_from        = range_from;
          l_to          = range_to;
-	 l_action_mode = action_mode;
-	 l_sel_mode    = sel_mode;
-	 l_sel_case    = sel_case;
-	 l_sel_invert  = sel_invert;
+         l_action_mode = action_mode;
+         l_sel_mode    = sel_mode;
+         l_sel_case    = sel_case;
+         l_sel_invert  = sel_invert;
 
          strncpy(&l_sel_pattern[0], sel_pattern, sizeof(l_sel_pattern) -1);
-	 l_sel_pattern[sizeof(l_sel_pattern) -1] = '\0';
+         l_sel_pattern[sizeof(l_sel_pattern) -1] = '\0';
          strncpy(&l_new_layername[0], new_layername, sizeof(l_new_layername) -1);
-	 l_new_layername[sizeof(l_new_layername) -1] = '\0';
+         l_new_layername[sizeof(l_new_layername) -1] = '\0';
       }
 
       if(l_rc >= 0)
       {
         /* no need to save the current image before processing
-	 * because the p_frames_modify procedure operates directly on the current frame
-	 * and loads all other frames from disc.
-	 * futher all successful processed frames are saved back to disk
-	 * (including the current one)
-	 */
+         * because the p_frames_modify procedure operates directly on the current frame
+         * and loads all other frames from disc.
+         * futher all successful processed frames are saved back to disk
+         * (including the current one)
+         */
            l_rc = p_frames_modify(ainfo_ptr, l_from, l_to,
-	                          l_action_mode,
-				  l_sel_mode, sel_case, sel_invert,
-				  &l_sel_pattern[0], &l_new_layername[0]
-				 );
+                                  l_action_mode,
+                                  l_sel_mode, sel_case, sel_invert,
+                                  &l_sel_pattern[0], &l_new_layername[0]
+                                 );
       }
 
     }

Modified: trunk/gap/gap_mod_layer.h
==============================================================================
--- trunk/gap/gap_mod_layer.h	(original)
+++ trunk/gap/gap_mod_layer.h	Sun Jul 13 17:41:41 2008
@@ -39,43 +39,43 @@
 #define MAX_LAYERNAME 128
 
 /* action_mode values */
-#define	 GAP_MOD_ACM_SET_VISIBLE    0
-#define	 GAP_MOD_ACM_SET_INVISIBLE  1
-#define	 GAP_MOD_ACM_SET_LINKED	    2
-#define	 GAP_MOD_ACM_SET_UNLINKED   3
-#define	 GAP_MOD_ACM_RAISE          4
-#define	 GAP_MOD_ACM_LOWER          5
-#define	 GAP_MOD_ACM_MERGE_EXPAND   6
-#define	 GAP_MOD_ACM_MERGE_IMG      7
-#define	 GAP_MOD_ACM_MERGE_BG       8
-#define	 GAP_MOD_ACM_APPLY_FILTER   9
-#define	 GAP_MOD_ACM_DUPLICATE     10
-#define	 GAP_MOD_ACM_DELETE        11
-#define	 GAP_MOD_ACM_RENAME        12
-
-#define	 GAP_MOD_ACM_SEL_REPLACE   13
-#define	 GAP_MOD_ACM_SEL_ADD       14
-#define	 GAP_MOD_ACM_SEL_SUBTRACT  15
-#define	 GAP_MOD_ACM_SEL_INTERSECT 16
-#define	 GAP_MOD_ACM_SEL_NONE      17
-#define	 GAP_MOD_ACM_SEL_ALL       18
-#define	 GAP_MOD_ACM_SEL_INVERT    19
-#define	 GAP_MOD_ACM_SEL_SAVE      20
-#define	 GAP_MOD_ACM_SEL_LOAD      21
-#define	 GAP_MOD_ACM_SEL_DELETE    22
-
-#define	 GAP_MOD_ACM_ADD_ALPHA        23
-#define	 GAP_MOD_ACM_LMASK_WHITE      24
-#define	 GAP_MOD_ACM_LMASK_BLACK      25
-#define	 GAP_MOD_ACM_LMASK_ALPHA      26
-#define	 GAP_MOD_ACM_LMASK_TALPHA     27
-#define	 GAP_MOD_ACM_LMASK_SEL        28
-#define	 GAP_MOD_ACM_LMASK_BWCOPY     29
-#define	 GAP_MOD_ACM_LMASK_DELETE     30
-#define	 GAP_MOD_ACM_LMASK_APPLY      31
+#define  GAP_MOD_ACM_SET_VISIBLE    0
+#define  GAP_MOD_ACM_SET_INVISIBLE  1
+#define  GAP_MOD_ACM_SET_LINKED     2
+#define  GAP_MOD_ACM_SET_UNLINKED   3
+#define  GAP_MOD_ACM_RAISE          4
+#define  GAP_MOD_ACM_LOWER          5
+#define  GAP_MOD_ACM_MERGE_EXPAND   6
+#define  GAP_MOD_ACM_MERGE_IMG      7
+#define  GAP_MOD_ACM_MERGE_BG       8
+#define  GAP_MOD_ACM_APPLY_FILTER   9
+#define  GAP_MOD_ACM_DUPLICATE     10
+#define  GAP_MOD_ACM_DELETE        11
+#define  GAP_MOD_ACM_RENAME        12
+
+#define  GAP_MOD_ACM_SEL_REPLACE   13
+#define  GAP_MOD_ACM_SEL_ADD       14
+#define  GAP_MOD_ACM_SEL_SUBTRACT  15
+#define  GAP_MOD_ACM_SEL_INTERSECT 16
+#define  GAP_MOD_ACM_SEL_NONE      17
+#define  GAP_MOD_ACM_SEL_ALL       18
+#define  GAP_MOD_ACM_SEL_INVERT    19
+#define  GAP_MOD_ACM_SEL_SAVE      20
+#define  GAP_MOD_ACM_SEL_LOAD      21
+#define  GAP_MOD_ACM_SEL_DELETE    22
+
+#define  GAP_MOD_ACM_ADD_ALPHA        23
+#define  GAP_MOD_ACM_LMASK_WHITE      24
+#define  GAP_MOD_ACM_LMASK_BLACK      25
+#define  GAP_MOD_ACM_LMASK_ALPHA      26
+#define  GAP_MOD_ACM_LMASK_TALPHA     27
+#define  GAP_MOD_ACM_LMASK_SEL        28
+#define  GAP_MOD_ACM_LMASK_BWCOPY     29
+#define  GAP_MOD_ACM_LMASK_DELETE     30
+#define  GAP_MOD_ACM_LMASK_APPLY      31
 
-#define	 GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK   32
-#define	 GAP_MOD_ACM_LMASK_COPY_FROM_LOWER_LMASK   33
+#define  GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK   32
+#define  GAP_MOD_ACM_LMASK_COPY_FROM_LOWER_LMASK   33
 
 #define  GAP_MOD_ACM_LMASK_INVERT                  34
 
@@ -106,6 +106,10 @@
 #define  GAP_MOD_ACM_SEL_ALPHA                     58
 #define  GAP_MOD_ACM_RESIZE_TO_IMG                 59
 
+#define  GAP_MOD_ACM_CREATE_LAYER_FROM_OPACITY     60
+#define  GAP_MOD_ACM_CREATE_LAYER_FROM_LMASK       61
+#define  GAP_MOD_ACM_CREATE_LAYER_FROM_ALPHA       62
+
 typedef struct
 {
   gint32 layer_id;
@@ -114,10 +118,10 @@
 }  GapModLayliElem;
 
 GapModLayliElem *gap_mod_alloc_layli(gint32 image_id, gint32 *l_sel_cnt, gint *nlayers,
-        		   gint32 sel_mode,
-        		   gint32 sel_case,
-			   gint32 sel_invert,
-        		   char *sel_pattern );
+                           gint32 sel_mode,
+                           gint32 sel_case,
+                           gint32 sel_invert,
+                           char *sel_pattern );
 int  gap_mod_get_1st_selected (GapModLayliElem * layli_ptr, gint nlayers);
 
 gint gap_mod_layer(GimpRunMode run_mode, gint32 image_id,

Modified: trunk/gap/gap_mod_layer_dialog.c
==============================================================================
--- trunk/gap/gap_mod_layer_dialog.c	(original)
+++ trunk/gap/gap_mod_layer_dialog.c	Sun Jul 13 17:41:41 2008
@@ -74,16 +74,16 @@
                            GapModFramesGlobalParams *gmop);
 static void p_make_func_menu_item(const char *title
                     , const char *tip_text
-		    , gint32 action_mode
-		    , GtkWidget *menu
-		    , GapModFramesGlobalParams *gmop
-		    );
+                    , gint32 action_mode
+                    , GtkWidget *menu
+                    , GapModFramesGlobalParams *gmop
+                    );
 
 static void p_make_func_menu_item_set_mode(const char *mode_name
-		    , gint32 action_mode
-		    , GtkWidget *menu
-		    , GapModFramesGlobalParams *gmop
-		    );
+                    , gint32 action_mode
+                    , GtkWidget *menu
+                    , GapModFramesGlobalParams *gmop
+                    );
 
 
 static void p_make_layer_attrinutes_submenu(GtkWidget *master_menu, GapModFramesGlobalParams *gmop);
@@ -119,13 +119,13 @@
     default:
       if(gmop->shell)
       {
-	GtkWidget *l_shell;
+        GtkWidget *l_shell;
 
         l_shell = gmop->shell;
         gmop->shell = NULL;
 
         gtk_widget_destroy(l_shell);
-	gtk_main_quit();
+        gtk_main_quit();
       }
 
       break;
@@ -291,10 +291,10 @@
 static void
 p_make_func_menu_item(const char *title
                     , const char *tip_text
-		    , gint32 action_mode
-		    , GtkWidget *menu
-		    , GapModFramesGlobalParams *gmop
-		    )
+                    , gint32 action_mode
+                    , GtkWidget *menu
+                    , GapModFramesGlobalParams *gmop
+                    )
 {
   GtkWidget *menu_item;
 
@@ -342,28 +342,28 @@
 
   p_make_func_menu_item(_("Set layer(s) visible")
                        ,_("set all selected layers visible")
-		       ,GAP_MOD_ACM_SET_VISIBLE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SET_VISIBLE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Set layer(s) invisible")
                        ,_("set all selected layers invisible")
-		       ,GAP_MOD_ACM_SET_INVISIBLE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SET_INVISIBLE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Set layer(s) linked")
                        ,_("set all selected layers linked")
-		       ,GAP_MOD_ACM_SET_LINKED
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SET_LINKED
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Set layer(s) unlinked")
                        ,_("set all selected layers unlinked")
-		       ,GAP_MOD_ACM_SET_UNLINKED
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SET_UNLINKED
+                       ,sub_menu
+                       ,gmop
+                       );
 
 }  /* end p_make_layer_attrinutes_submenu */
 
@@ -374,9 +374,9 @@
  */
 static void
 p_make_func_menu_item_set_mode(const char *mode_name
-		    , gint32 action_mode
-		    , GtkWidget *menu
-		    , GapModFramesGlobalParams *gmop)
+                    , gint32 action_mode
+                    , GtkWidget *menu
+                    , GapModFramesGlobalParams *gmop)
 {
   char *title;
   char *tip_text;
@@ -548,16 +548,16 @@
 
   p_make_func_menu_item(_("Raise layer(s)")
                        ,_("raise all selected layers")
-		       ,GAP_MOD_ACM_RAISE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_RAISE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Lower layer(s)")
                        ,_("lower all selected layers")
-		       ,GAP_MOD_ACM_LOWER
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LOWER
+                       ,sub_menu
+                       ,gmop
+                       );
 }  /* end p_make_layer_stackpositions_submenu */
 
 
@@ -581,22 +581,22 @@
 
   p_make_func_menu_item(_("Merge layer(s); expand as necessary")
                        ,_("merge selected layers and expand as necessary")
-		       ,GAP_MOD_ACM_MERGE_EXPAND
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_MERGE_EXPAND
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Merge layer(s) clipped to image")
                        ,_("merge selected layers and clip to image")
-		       ,GAP_MOD_ACM_MERGE_IMG
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_MERGE_IMG
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Merge layer(s) clipped to bg-layer")
                        ,_("merge selected layers and clip to bg-layer")
-		       ,GAP_MOD_ACM_MERGE_BG
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_MERGE_BG
+                       ,sub_menu
+                       ,gmop
+                       );
 
 }  /* end p_make_merge_layers_submenu */
 
@@ -621,46 +621,46 @@
 
   p_make_func_menu_item(_("Replace selection (source is the active frame)")
                        ,_("Replace Selection by Selection of the invoking Frame Image")
-		       ,GAP_MOD_ACM_SEL_REPLACE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_REPLACE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add selection (source is the active frame)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_ADD
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_ADD
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Subtract selection (source is the active frame)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_SUBTRACT
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_SUBTRACT
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Intersect selection (source is the active frame)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_INTERSECT
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_INTERSECT
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Selection none")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_NONE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_NONE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Selection all")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_ALL
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_ALL
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Selection invert")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_INVERT
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_INVERT
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Selection from alpha channel (individual per frame)")
                        ,NULL
                        ,GAP_MOD_ACM_SEL_ALPHA
@@ -669,22 +669,22 @@
                        );
   p_make_func_menu_item(_("Save selection to channel (individual per frame)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_SAVE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_SAVE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Load selection from channel (individual per frame)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_LOAD
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_LOAD
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Delete channel (by name)")
                        ,NULL
-		       ,GAP_MOD_ACM_SEL_DELETE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_SEL_DELETE
+                       ,sub_menu
+                       ,gmop
+                       );
 }  /* end p_make_selection_submenu */
 
 
@@ -708,40 +708,40 @@
 
   p_make_func_menu_item(_("Add white layermask (opaque)")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_WHITE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_WHITE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add black layermask (transparent)")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_BLACK
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_BLACK
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add layermask from alpha")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_ALPHA
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_ALPHA
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add layermask transfer from alpha")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_TALPHA
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_TALPHA
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add layermask from selection")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_SEL
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_SEL
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Add layermask from bw copy")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_BWCOPY
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_BWCOPY
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Invert existing layermask")
                        ,NULL
                        ,GAP_MOD_ACM_LMASK_INVERT
@@ -750,34 +750,54 @@
                        );
   p_make_func_menu_item(_("Apply filter on layermask")
                        ,NULL
-		       ,GAP_MOD_ACM_APPLY_FILTER_ON_LAYERMASK
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_APPLY_FILTER_ON_LAYERMASK
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Delete layermask")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_DELETE
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_DELETE
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Apply layermask")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_APPLY
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_APPLY
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Copy layermask from layer above")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_COPY_FROM_UPPER_LMASK
+                       ,sub_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Copy layermask from layer below")
                        ,NULL
-		       ,GAP_MOD_ACM_LMASK_COPY_FROM_LOWER_LMASK
-		       ,sub_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_LMASK_COPY_FROM_LOWER_LMASK
+                       ,sub_menu
+                       ,gmop
+                       );
+
+  p_make_func_menu_item(_("Create mask layer representing the opacity (alpha+layermask merged)")
+                       ,NULL
+                       ,GAP_MOD_ACM_CREATE_LAYER_FROM_OPACITY
+                       ,sub_menu
+                       ,gmop
+                       );
+  p_make_func_menu_item(_("Create mask layer as copy of the layermask (ignore alpha)")
+                       ,NULL
+                       ,GAP_MOD_ACM_CREATE_LAYER_FROM_LMASK
+                       ,sub_menu
+                       ,gmop
+                       );
+  p_make_func_menu_item(_("Create mask layer as copy of the alpha channel (ignore layermask)")
+                       ,NULL
+                       ,GAP_MOD_ACM_CREATE_LAYER_FROM_ALPHA
+                       ,sub_menu
+                       ,gmop
+                       );
+
 }  /* end p_make_layermask_submenu */
 
 
@@ -791,28 +811,28 @@
   /* apply filter has no sub_menu */
   p_make_func_menu_item(_("Apply filter on layer(s)")
                        ,_("apply filter to all selected layers")
-		       ,GAP_MOD_ACM_APPLY_FILTER
-		       ,master_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_APPLY_FILTER
+                       ,master_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Duplicate layer(s)")
                        ,NULL
-		       ,GAP_MOD_ACM_DUPLICATE
-		       ,master_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_DUPLICATE
+                       ,master_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Delete layer(s)")
                        ,NULL
-		       ,GAP_MOD_ACM_DELETE
-		       ,master_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_DELETE
+                       ,master_menu
+                       ,gmop
+                       );
   p_make_func_menu_item(_("Rename layer(s)")
                        ,NULL
-		       ,GAP_MOD_ACM_RENAME
-		       ,master_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_RENAME
+                       ,master_menu
+                       ,gmop
+                       );
 
   p_make_func_menu_item(_("Resize layer(s) to image size")
                        ,_("Resize selected layer(s) to image size")
@@ -823,10 +843,10 @@
 
   p_make_func_menu_item(_("Add alpha channel")
                        ,NULL
-		       ,GAP_MOD_ACM_ADD_ALPHA
-		       ,master_menu
-		       ,gmop
-		       );
+                       ,GAP_MOD_ACM_ADD_ALPHA
+                       ,master_menu
+                       ,gmop
+                       );
 }  /* end p_make_toplevel_menu_items */
 
 
@@ -887,7 +907,7 @@
 
   g_snprintf(gmop->sel_pattern, sizeof(gmop->sel_pattern), "%s"
             , gtk_entry_get_text(GTK_ENTRY(widget))
-	    );
+            );
 }  /* end p_layer_pattern_entry_update_cb */
 
 /* --------------------------
@@ -904,7 +924,7 @@
 
   g_snprintf(gmop->new_layername, sizeof(gmop->new_layername), "%s"
             , gtk_entry_get_text(GTK_ENTRY(widget))
-	    );
+            );
 }  /* end p_new_layername_entry_update_cb */
 
 
@@ -963,11 +983,11 @@
 
   dlg = gimp_dialog_new (_("Frames Modify"), GAP_MOD_FRAMES_PLUGIN_NAME,
                          NULL, 0,
-			 gimp_standard_help_func, GAP_MOD_FRAMES_HELP_ID,
+                         gimp_standard_help_func, GAP_MOD_FRAMES_HELP_ID,
 
-			 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-			 GTK_STOCK_OK,     GTK_RESPONSE_OK,
-			 NULL);
+                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                         GTK_STOCK_OK,     GTK_RESPONSE_OK,
+                         NULL);
 
   gmop->shell = dlg;
 
@@ -1015,8 +1035,8 @@
 // as workaround dont show tooltip for the menu_bar at all:
 //  gimp_help_set_help_data (menu_bar
 //                          , _("Function to be performed on all selected layers "
-//			      "in all frames of the selected frame range")
-//			  , NULL);
+//                            "in all frames of the selected frame range")
+//                        , NULL);
 
 
   gtk_table_attach (GTK_TABLE(table), menu_bar, 0, 1, row, row+1
@@ -1071,12 +1091,12 @@
   gtk_table_attach (GTK_TABLE(table), entry, 1, 2, row, row+1
                     ,GTK_FILL|GTK_EXPAND , 0, 0, 0);
   g_signal_connect(G_OBJECT(entry), "changed",
-		   G_CALLBACK (p_new_layername_entry_update_cb),
-		   gmop);
+                   G_CALLBACK (p_new_layername_entry_update_cb),
+                   gmop);
   gimp_help_set_help_data(entry
                          , _("Name for all handled layers (or channels),\n"
                              "where the string '[######]' is replaced by the frame number.")
-		         , NULL);
+                         , NULL);
 
 
   /*  +++++++++++++++++++++++++  */
@@ -1103,17 +1123,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_EQUAL);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select all layers where layer name is equal to pattern")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_EQUAL));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   /* the case sensitive  check_button */
   check_button = gtk_check_button_new_with_label (_("Case sensitive"));
@@ -1124,12 +1144,12 @@
                    ,(GtkAttachOptions) (0), 0, 0);
   gimp_help_set_help_data (check_button
                           , _("Lowercase and uppercase letters are considered as different")
-			  , NULL);
+                          , NULL);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button)
-				, gmop->sel_case);
+                                , gmop->sel_case);
   g_signal_connect ( G_OBJECT (check_button), "toggled",
-		     G_CALLBACK (p_case_sensitive_toggled_callback),
-		     gmop);
+                     G_CALLBACK (p_case_sensitive_toggled_callback),
+                     gmop);
 
   row++;
 
@@ -1141,17 +1161,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_START);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select all layers where layer name starts with pattern")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_START));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   /* the invert layer_selection  check_button */
   check_button = gtk_check_button_new_with_label (_("Invert Layer Selection"));
@@ -1162,12 +1182,12 @@
                     ,(GtkAttachOptions) (0), 0, 0);
   gimp_help_set_help_data (check_button
                           , _("Perform actions on all unselected layers")
-			  , NULL);
+                          , NULL);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button)
-				, gmop->sel_invert);
+                                , gmop->sel_invert);
   g_signal_connect ( G_OBJECT (check_button), "toggled",
-		     G_CALLBACK (p_invert_selection_toggled_callback),
-		     gmop);
+                     G_CALLBACK (p_invert_selection_toggled_callback),
+                     gmop);
 
   row++;
 
@@ -1179,17 +1199,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_END);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select all layers where layer name ends up with pattern")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_END));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   row++;
 
@@ -1201,17 +1221,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_ANYWHERE);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select all layers where layer name contains pattern")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_ANYWHERE));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   row++;
 
@@ -1223,17 +1243,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_NUMBERLIST);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select layerstack positions where 0 is the top layer.\nExample: 0, 4-5, 8")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_NUMBERLIST));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   row++;
 
@@ -1245,17 +1265,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_INV_NUMBERLIST);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select layerstack positions where 0 is the background layer.\nExample: 0, 4-5, 8")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_INV_NUMBERLIST));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
   row++;
 
@@ -1267,17 +1287,17 @@
 
   l_radio_pressed = (gmop->sel_mode == GAP_MTCH_ALL_VISIBLE);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button),
-				   l_radio_pressed);
+                                   l_radio_pressed);
   gimp_help_set_help_data(radio_button
                          , _("Select all visible layers")
-			 , NULL);
+                         , NULL);
 
   gtk_widget_show (radio_button);
   g_object_set_data (G_OBJECT (radio_button), RADIO_ITEM_INDEX_KEY
                      , GINT_TO_POINTER(GAP_MTCH_ALL_VISIBLE));
   g_signal_connect ( G_OBJECT (radio_button), "toggled",
-		     G_CALLBACK (p_sel_mode_radio_callback),
-		     gmop);
+                     G_CALLBACK (p_sel_mode_radio_callback),
+                     gmop);
 
 
   row++;
@@ -1298,11 +1318,11 @@
   gtk_entry_set_text(GTK_ENTRY(entry), gmop->sel_pattern);
   gimp_help_set_help_data(entry
                          , _("String to identify layer names or layerstack position numbers. Example: 0,3-5")
-			 , NULL);
+                         , NULL);
   gtk_widget_show(entry);
   g_signal_connect(G_OBJECT(entry), "changed",
-		   G_CALLBACK (p_layer_pattern_entry_update_cb),
-		   gmop);
+                   G_CALLBACK (p_layer_pattern_entry_update_cb),
+                   gmop);
 
   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 4);
@@ -1331,16 +1351,16 @@
 
   /* the from_frame scale entry */
   adj = gimp_scale_entry_new (GTK_TABLE (range_table), 0, row,
-			      _("From Frame:"), SCALE_WIDTH, SPIN_BUTTON_WIDTH,
-			      (gdouble)gmop->ainfo_ptr->first_frame_nr,
-			      (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower */
-			      (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper */
-			      1, 10,          /* step, page */
-			      0,              /* digits */
-			      TRUE,           /* constrain */
-			      (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower unconstrained */
-			      (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper unconstrained */
-			      _("First handled frame"), NULL);
+                              _("From Frame:"), SCALE_WIDTH, SPIN_BUTTON_WIDTH,
+                              (gdouble)gmop->ainfo_ptr->first_frame_nr,
+                              (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower */
+                              (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper */
+                              1, 10,          /* step, page */
+                              0,              /* digits */
+                              TRUE,           /* constrain */
+                              (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower unconstrained */
+                              (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper unconstrained */
+                              _("First handled frame"), NULL);
   gmop->frame_from_adj = adj;
   g_object_set_data(G_OBJECT(adj), "gmop", gmop);
   g_signal_connect (adj, "value_changed",
@@ -1353,16 +1373,16 @@
 
   /* the to_frame scale entry */
   adj = gimp_scale_entry_new (GTK_TABLE (range_table), 0, row,
-			      _("To Frame:"), SCALE_WIDTH, SPIN_BUTTON_WIDTH,
-			      (gdouble)gmop->ainfo_ptr->last_frame_nr,
-			      (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower */
-			      (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper */
-			      1, 10,          /* step, page */
-			      0,              /* digits */
-			      TRUE,           /* constrain */
-			      (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower unconstrained */
-			      (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper unconstrained */
-			      _("Last handled frame"), NULL);
+                              _("To Frame:"), SCALE_WIDTH, SPIN_BUTTON_WIDTH,
+                              (gdouble)gmop->ainfo_ptr->last_frame_nr,
+                              (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower */
+                              (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper */
+                              1, 10,          /* step, page */
+                              0,              /* digits */
+                              TRUE,           /* constrain */
+                              (gdouble)gmop->ainfo_ptr->first_frame_nr,  /* lower unconstrained */
+                              (gdouble)gmop->ainfo_ptr->last_frame_nr,   /* upper unconstrained */
+                              _("Last handled frame"), NULL);
   gmop->frame_to_adj = adj;
   g_object_set_data(G_OBJECT(adj), "gmop", gmop);
   g_signal_connect (adj, "value_changed",

Modified: trunk/gap/gap_mod_layer_dialog.h
==============================================================================
--- trunk/gap/gap_mod_layer_dialog.h	(original)
+++ trunk/gap/gap_mod_layer_dialog.h	Sun Jul 13 17:41:41 2008
@@ -1,4 +1,3 @@
-
 /* gap_mod_layer_dialog.h
  * 2004.11.11 hof (Wolfgang Hofer)
  *

Modified: trunk/gap/gap_vex_dialog.c
==============================================================================
--- trunk/gap/gap_vex_dialog.c	(original)
+++ trunk/gap/gap_vex_dialog.c	Sun Jul 13 17:41:41 2008
@@ -88,6 +88,8 @@
 static void        on_mw__combo_deinterlace  (GtkWidget     *widget,
                                               GapVexMainGlobalParams *gpp);
 
+static void        on_mw__checkbutton_bluebox_toggled (GtkToggleButton *togglebutton,
+                                        GapVexMainGlobalParams *gpp);
 static void        on_mw__checkbutton_disable_mmx_toggled (GtkToggleButton *togglebutton,
                                         GapVexMainGlobalParams *gpp);
 static void        on_mw__spinbutton_begin_frame_changed  (GtkEditable     *editable,
@@ -392,6 +394,14 @@
   gtk_widget_set_sensitive(gpp->mw__combo_deinterlace, sensitive);
   gtk_widget_set_sensitive(gpp->mw__checkbutton_multilayer, sensitive);
 
+  gtk_widget_set_sensitive(gpp->mw__checkbutton_generate_alpha_via_bluebox, sensitive);
+  if(gpp->val.generate_alpha_via_bluebox != TRUE)
+  {
+      sensitive = FALSE;
+  }
+  gtk_widget_set_sensitive(gpp->mw__checkbutton_extract_alpha_as_gray_frames, sensitive);
+  gtk_widget_set_sensitive(gpp->mw__checkbutton_extract_with_layermask, sensitive);
+
   if((gpp->val.multilayer == 0) && (sensitive_vid))
   {
       sensitive = TRUE;  /* we want to extract to frame files on disc */
@@ -954,6 +964,86 @@
 
 
 /* --------------------------------
+ * on_mw__checkbutton_bluebox_toggled
+ * --------------------------------
+ */
+static void
+on_mw__checkbutton_bluebox_toggled
+                                        (GtkToggleButton *togglebutton,
+                                        GapVexMainGlobalParams *gpp)
+{
+ GtkWidget *wgt;
+
+ if(gap_debug) printf("CB: on_mw__checkbutton_bluebox_toggled\n");
+ if(gpp == NULL) return;
+
+ wgt = gpp->mw__checkbutton_generate_alpha_via_bluebox;
+
+ if (GTK_TOGGLE_BUTTON (wgt)->active)
+ {
+    gpp->val.generate_alpha_via_bluebox = TRUE;
+ }
+ else
+ {
+    gpp->val.generate_alpha_via_bluebox = FALSE;
+ }
+ p_update_wgt_sensitivity(gpp);
+
+}
+
+/* --------------------------------
+ * on_mw__checkbutton_graymask_toggled
+ * --------------------------------
+ */
+static void
+on_mw__checkbutton_graymask_toggled
+                                        (GtkToggleButton *togglebutton,
+                                        GapVexMainGlobalParams *gpp)
+{
+ GtkWidget *wgt;
+
+ if(gap_debug) printf("CB: on_mw__checkbutton_graymask_toggled\n");
+ if(gpp == NULL) return;
+
+ wgt = gpp->mw__checkbutton_extract_alpha_as_gray_frames;
+
+ if (GTK_TOGGLE_BUTTON (wgt)->active)
+ {
+    gpp->val.extract_alpha_as_gray_frames = TRUE;
+ }
+ else
+ {
+    gpp->val.extract_alpha_as_gray_frames = FALSE;
+ }
+}
+
+/* --------------------------------
+ * on_mw__checkbutton_layermask_toggled
+ * --------------------------------
+ */
+static void
+on_mw__checkbutton_layermask_toggled
+                                        (GtkToggleButton *togglebutton,
+                                        GapVexMainGlobalParams *gpp)
+{
+ GtkWidget *wgt;
+
+ if(gap_debug) printf("CB: on_mw__checkbutton_layermask_toggled\n");
+ if(gpp == NULL) return;
+
+ wgt = gpp->mw__checkbutton_extract_with_layermask;
+
+ if (GTK_TOGGLE_BUTTON (wgt)->active)
+ {
+    gpp->val.extract_with_layermask = TRUE;
+ }
+ else
+ {
+    gpp->val.extract_with_layermask = FALSE;
+ }
+}
+
+/* --------------------------------
  * on_mw__checkbutton_disable_mmx_toggled
  * --------------------------------
  */
@@ -1913,6 +2003,7 @@
   GtkWidget *mw__button_OK;
   GtkWidget *mw__player_frame;
   GtkWidget *mw__main_hbox;
+  GtkWidget *checkbutton;
   GtkWidget *label;
   GtkWidget *hbox2;
   GtkWidget *wgt_array[50];
@@ -2362,6 +2453,7 @@
 			      "Off: extracted frames are written to frame files on disc")
 			  , NULL);
 
+
   out_row++;
 
   /* the basename label */
@@ -2425,6 +2517,7 @@
   gtk_box_pack_start (GTK_BOX (hbox2), mw__spinbutton_fn_digits, FALSE, FALSE, 0);
   gimp_help_set_help_data (mw__spinbutton_fn_digits, _("Digits to use for framenumber part in filenames (use 1 if you dont want leading zeroes)"), NULL);
 
+
   /* dummy label to fill up the hbox2 */
   label = gtk_label_new (" ");
   gtk_widget_show (label);
@@ -2432,6 +2525,49 @@
 
 
 
+  /* the graymask checkbutton */
+  checkbutton = gtk_check_button_new_with_label (_("graymask"));
+  gpp->mw__checkbutton_extract_alpha_as_gray_frames = checkbutton;
+  gtk_widget_show (checkbutton);
+  gtk_box_pack_start (GTK_BOX (hbox2), checkbutton, TRUE, TRUE, 0);
+  gimp_help_set_help_data (checkbutton
+                          , _("On: extract grayscale mask (generated by bluebox)\n"
+			      "Off: extract color frames 1.1")
+			  , NULL);
+  g_signal_connect (G_OBJECT (checkbutton), "toggled",
+                      G_CALLBACK (on_mw__checkbutton_graymask_toggled),
+                      gpp);
+
+  /* the layermask checkbutton */
+  checkbutton = gtk_check_button_new_with_label (_("layermask"));
+  gpp->mw__checkbutton_extract_with_layermask = checkbutton;
+  gtk_widget_show (checkbutton);
+  gtk_box_pack_start (GTK_BOX (hbox2), checkbutton, TRUE, TRUE, 0);
+  gimp_help_set_help_data (checkbutton
+                          , _("On: bluebox shall generate transparency as layermask\n"
+			      "Off: bluebox shall generate transparency as alpha channel")
+			  , NULL);
+  g_signal_connect (G_OBJECT (checkbutton), "toggled",
+                      G_CALLBACK (on_mw__checkbutton_layermask_toggled),
+                      gpp);
+
+  /* the bluebox checkbutton */
+  checkbutton = gtk_check_button_new_with_label (_("bluebox"));
+  gpp->mw__checkbutton_generate_alpha_via_bluebox = checkbutton;
+  gtk_widget_show (checkbutton);
+  gtk_table_attach (GTK_TABLE (mw__table_out), checkbutton, 2, 3, out_row, out_row+1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gimp_help_set_help_data (checkbutton
+                          , _("On: add trasparency for extracted frames via blubox filter"
+                              " (using values of last run in this session)\n"
+			      "Off: extract frames 1.1")
+			  , NULL);
+  g_signal_connect (G_OBJECT (checkbutton), "toggled",
+                      G_CALLBACK (on_mw__checkbutton_bluebox_toggled),
+                      gpp);
+
+
   out_row++;
 
   /* the extension label */

Modified: trunk/gap/gap_vex_exec.c
==============================================================================
--- trunk/gap/gap_vex_exec.c	(original)
+++ trunk/gap/gap_vex_exec.c	Sun Jul 13 17:41:41 2008
@@ -33,7 +33,8 @@
 #include "gap_vex_exec.h"
 #include "gap_vex_dialog.h"
 #include "gap_audio_wav.h"
-
+#include "gap_audio_extract.h"
+#include "gap_bluebox.h"
 
 /* -------------------
  * p_gap_set_framerate
@@ -58,6 +59,107 @@
 }  /* end p_gap_set_framerate */
 
 
+/* --------------------
+ * p_vex_apply_bluebox
+ * --------------------
+ * apply bluebox settings on the specified layer
+ */
+static void
+p_vex_apply_bluebox(gint32 layer_id
+                  )
+{
+  GapBlueboxGlobalParams *bbp;
+  /* blubox parameters are not provided by the caller.
+   * in this case we init with default values and try to fetch
+   * values from previous bluebox filter runs
+   */
+  bbp = gap_bluebox_bbp_new(layer_id);;
+
+  if(bbp)
+  {
+    bbp->image_id = gimp_drawable_get_image(layer_id);
+    bbp->drawable_id = layer_id;
+    bbp->layer_id = layer_id;
+    bbp->run_mode = GIMP_RUN_NONINTERACTIVE;
+    bbp->run_flag = TRUE;
+
+    gap_bluebox_apply(bbp);
+  }
+}  /* end p_vex_apply_bluebox  */
+
+
+/* ----------------------
+ * p_frame_postprocessing
+ * ----------------------
+ * generate transpareny as alpha channel or layermask
+ * via bluebox effect (if requested)
+ */
+static void
+p_frame_postprocessing(t_GVA_Handle   *gvahand
+       ,GapVexMainGlobalParams *gpp)
+{
+  gint32 l_bbox_layer_id;
+  gint32 l_layermask_id;
+  
+  l_bbox_layer_id = gvahand->layer_id;
+  if (gpp->val.generate_alpha_via_bluebox == TRUE)
+  {
+    if ((gpp->val.extract_with_layermask == TRUE)
+    || (gpp->val.extract_with_layermask == TRUE))
+    {
+      l_bbox_layer_id = gimp_layer_copy(gvahand->layer_id);
+      gimp_image_add_layer(gvahand->image_id, l_bbox_layer_id, -1);
+
+      if(gap_debug)
+      {
+        printf("created bb_layer_id:%d\n", l_bbox_layer_id);
+      }
+      
+    }
+    if (!gimp_drawable_has_alpha(l_bbox_layer_id))
+    {
+      gimp_layer_add_alpha(l_bbox_layer_id);
+    }
+    p_vex_apply_bluebox(l_bbox_layer_id);
+  }
+
+  if (gimp_drawable_has_alpha(l_bbox_layer_id))
+  {
+    if (gpp->val.extract_alpha_as_gray_frames == TRUE)
+    {
+      l_layermask_id = gimp_layer_create_mask(l_bbox_layer_id, GIMP_ADD_ALPHA_MASK);
+      if(gap_debug)
+      {
+        printf("GRAY created layermask_id:%d\n", l_layermask_id);
+      }
+      gap_layer_copy_paste_drawable(gvahand->image_id, gvahand->layer_id, l_layermask_id);
+    } 
+    else if (gpp->val.extract_with_layermask == TRUE)
+    {
+      l_layermask_id = gimp_layer_create_mask(l_bbox_layer_id, GIMP_ADD_ALPHA_MASK);
+      if(gap_debug)
+      {
+        printf("LAYERMASK created layermask_id:%d\n", l_layermask_id);
+      }
+      gimp_layer_add_mask(gvahand->layer_id, l_layermask_id);
+    }
+
+    if (l_bbox_layer_id != gvahand->layer_id)
+    {
+      if(gap_debug)
+      {
+        printf("remove bb_layer_id:%d\n", l_bbox_layer_id);
+      }
+
+      /* remove the temporyry bluebox layer */
+      gimp_image_remove_layer(gvahand->image_id, l_bbox_layer_id);
+      //gimp_drawable_delete(l_bbox_layer_id);
+    }
+  }
+  
+
+}  /* end p_frame_postprocessing  */
+
 
 /* ------------------------------
  * gap_vex_exe_extract_videorange
@@ -87,6 +189,7 @@
 
   l_overwrite_mode_audio = 0;
 
+
   if(gap_debug)
   {
       printf("RUN gap_vex_exe_extract_videorange with parameters:\n");
@@ -110,6 +213,10 @@
       printf("exact_seek   : %d\n", (int)gpp->val.exact_seek);
       printf("deinterlace  : %d\n", (int)gpp->val.deinterlace);
       printf("delace_threshold: %f\n", (float)gpp->val.delace_threshold);
+
+      printf("generate_alpha_via_bluebox: %d\n", (int)gpp->val.generate_alpha_via_bluebox);
+      printf("extract_alpha_as_gray_frames: %d\n", (int)gpp->val.extract_alpha_as_gray_frames);
+      printf("extract_with_layermask: %d\n", (int)gpp->val.extract_with_layermask);
   }
 
   l_save_run_mode = GIMP_RUN_INTERACTIVE;  /* for the 1.st call of saving a non xcf frame */
@@ -371,11 +478,27 @@
            else
            {
               gint32 l_sav_rc;
+              gint32 l_sav_image_id;
               
-              l_sav_rc = gap_lib_save_named_image(gvahand->image_id
+              l_sav_image_id = gvahand->image_id;
+              
+              p_frame_postprocessing(gvahand, gpp);
+              if (gpp->val.extract_alpha_as_gray_frames == TRUE)
+              {
+                l_sav_image_id = gimp_image_duplicate(gvahand->image_id);
+                gimp_image_convert_grayscale(l_sav_image_id);
+              }
+
+              l_sav_rc = gap_lib_save_named_image(l_sav_image_id
                            , framename
                            , l_save_run_mode
                            );
+                           
+              if (l_sav_image_id != gvahand->image_id)
+              {
+                /* delete temporary grayscale image */
+                gap_image_delete_immediate(l_sav_image_id);
+              }
               if (l_sav_rc < 0)
               {
                 g_message(_("failed to save file:\n'%s'"), framename);
@@ -394,6 +517,7 @@
                                        ,delace[0]
                                        ,gpp->val.delace_threshold
                                        );
+         p_frame_postprocessing(gvahand, gpp);
          if(l_rc != GVA_RET_OK)
          {
            break;

Modified: trunk/gap/gap_vex_main.c
==============================================================================
--- trunk/gap/gap_vex_main.c	(original)
+++ trunk/gap/gap_vex_main.c	Sun Jul 13 17:41:41 2008
@@ -114,6 +114,9 @@
     { GIMP_PDB_INT32, "deinterlace", "0: NO, 1: deinterlace odd rows only, 2: deinterlace even rows only, 3: deinterlace split into 2 frames where odd rows-frame is 1st, 4: deinterlace split into 2 frames where even rows-frame is 1st)" },
     { GIMP_PDB_FLOAT, "delace_threshold", "0.0 .. no interpolation, 1.0 smooth interpolation at deinterlacing" },
     { GIMP_PDB_INT32, "fn_digits", "1 <= fn_digits <= 8, number of digits to use in framenames (use 1 if you dont want leading zeroes) " },
+    { GIMP_PDB_INT32, "bluebox", "0: NO, 1: YES generate transparency by applying bluebox filter with last values" },
+    { GIMP_PDB_INT32, "graymask", "0: NO (extract frames 1:1), 1: YES extract generated transparency as gray mask" },
+    { GIMP_PDB_INT32, "layermask", "0: NO (bluebox shall generate aplha channel), 1: YES (bluebox shall generate layermask)" },
   };
   static GimpParamDef load_return_vals[] =
   {
@@ -146,6 +149,9 @@
     { GIMP_PDB_INT32, "deinterlace", "0: NO, 1: deinterlace odd rows only, 2: deinterlace even rows only, 3: deinterlace split into 2 frames where odd rows-frame is 1st, 4: deinterlace split into 2 frames where even rows-frame is 1st)" },
     { GIMP_PDB_FLOAT, "delace_threshold", "0.0 .. no interpolation, 1.0 smooth interpolation at deinterlacing" },
     { GIMP_PDB_INT32, "fn_digits", "1 <= fn_digits <= 8, number of digits to use in framenames (use 1 if you dont want leading zeroes) " },
+    { GIMP_PDB_INT32, "bluebox", "0: NO, 1: YES generate transparency by applying bluebox filter with last values" },
+    { GIMP_PDB_INT32, "graymask", "0: NO (extract frames 1:1), 1: YES extract generated transparency as gray mask" },
+    { GIMP_PDB_INT32, "layermask", "0: NO (bluebox shall generate aplha channel), 1: YES (bluebox shall generate layermask)" },
   };
   static int next_args = sizeof (ext_args) / sizeof (ext_args[0]);
 
@@ -244,6 +250,9 @@
                       , (int)nparams );
 
 
+  gpp->val.generate_alpha_via_bluebox = FALSE;
+  gpp->val.extract_alpha_as_gray_frames = FALSE;
+  gpp->val.extract_with_layermask = FALSE;
 
   if(strcmp(name, GAP_VEX_PLUG_IN_NAME) == 0)
   {
@@ -281,7 +290,7 @@
   if(gpp->val.run_mode == GIMP_RUN_NONINTERACTIVE)
   {
     /* ---------- get batch parameters  ----------*/
-    expected_params = l_par + 18;
+    expected_params = l_par + 21;
     if(nparams != expected_params)
     {
        printf("Calling Error wrong number of params %d (expected: %d)\n"
@@ -347,6 +356,10 @@
     gpp->val.delace_threshold   = param[l_par + 17].data.d_float;
     gpp->val.fn_digits     = param[l_par + 18].data.d_int32;
 
+    gpp->val.generate_alpha_via_bluebox     = param[l_par + 19].data.d_int32;
+    gpp->val.extract_alpha_as_gray_frames   = param[l_par + 20].data.d_int32;
+    gpp->val.extract_with_layermask         = param[l_par + 21].data.d_int32;
+
     gpp->val.run = TRUE;
   }
   else

Modified: trunk/gap/gap_vex_main.h
==============================================================================
--- trunk/gap/gap_vex_main.h	(original)
+++ trunk/gap/gap_vex_main.h	Sun Jul 13 17:41:41 2008
@@ -110,6 +110,10 @@
   /* current states of actual loaded (frame)image */
   gint32  image_ID;        /* -1 if there is no valid current image */
   GimpRunMode run_mode;
+  
+  gboolean generate_alpha_via_bluebox;
+  gboolean extract_alpha_as_gray_frames;
+  gboolean extract_with_layermask;
 } GapVexMainVal;
 
 
@@ -162,6 +166,10 @@
   GtkWidget *mw__button_OK;
   GtkWidget *mw__begin_time_label;
   GtkWidget *mw__end_time_label;
+
+  GtkWidget *mw__checkbutton_generate_alpha_via_bluebox;
+  GtkWidget *mw__checkbutton_extract_alpha_as_gray_frames;
+  GtkWidget *mw__checkbutton_extract_with_layermask;
   
 } GapVexMainGlobalParams;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]