app: change the layer's graph to expect mode operations with mask inputs

and opacity inputs. Add two offset nodes for both layer and mask, and
plug everything directly into the mode node.
This commit is contained in:
Michael Natterer
2012-05-16 19:45:18 +02:00
parent 39c18e9a48
commit efa52edf6e
3 changed files with 80 additions and 68 deletions

View File

@ -887,9 +887,9 @@ gimp_drawable_sync_source_node (GimpDrawable *drawable,
fs_source = gimp_drawable_get_source_node (GIMP_DRAWABLE (fs)); fs_source = gimp_drawable_get_source_node (GIMP_DRAWABLE (fs));
/* rip the fs' source node out of its graph */ /* rip the fs' source node out of its graph */
if (fs->opacity_node) if (fs->layer_offset_node)
{ {
gegl_node_disconnect (fs->opacity_node, "input"); gegl_node_disconnect (fs->layer_offset_node, "input");
gegl_node_remove_child (gimp_item_get_node (GIMP_ITEM (fs)), gegl_node_remove_child (gimp_item_get_node (GIMP_ITEM (fs)),
fs_source); fs_source);
} }
@ -977,12 +977,12 @@ gimp_drawable_sync_source_node (GimpDrawable *drawable,
fs_source); fs_source);
/* plug the fs' source node back into its graph */ /* plug the fs' source node back into its graph */
if (fs->opacity_node) if (fs->layer_offset_node)
{ {
gegl_node_add_child (gimp_item_get_node (GIMP_ITEM (fs)), gegl_node_add_child (gimp_item_get_node (GIMP_ITEM (fs)),
fs_source); fs_source);
gegl_node_connect_to (fs_source, "output", gegl_node_connect_to (fs_source, "output",
fs->opacity_node, "input"); fs->layer_offset_node, "input");
} }
gegl_node_remove_child (drawable->private->source_node, gegl_node_remove_child (drawable->private->source_node,

View File

@ -872,19 +872,43 @@ gimp_layer_get_node (GimpItem *item)
if (! source_node_hijacked) if (! source_node_hijacked)
gegl_node_add_child (node, source); gegl_node_add_child (node, source);
g_warn_if_fail (layer->opacity_node == NULL); g_warn_if_fail (layer->layer_offset_node == NULL);
g_warn_if_fail (layer->offset_node == NULL); g_warn_if_fail (layer->mask_offset_node == NULL);
layer->opacity_node = gegl_node_new_child (node, /* the mode node connects it all, and has aux and aux2 inputs for
"operation", "gegl:opacity", * the layer and its mask
"value", layer->opacity, */
NULL); mode_node = gimp_drawable_get_mode_node (drawable);
if (! source_node_hijacked && gimp_gegl_node_set_layer_mode (mode_node,
(! layer->mask || ! gimp_layer_get_show_mask (layer))) layer->mode,
TRUE);
gegl_node_set (mode_node,
"opacity", layer->opacity,
NULL);
/* the layer's offset node */
layer->layer_offset_node = gegl_node_new_child (node,
"operation", "gegl:translate",
NULL);
gimp_item_add_offset_node (GIMP_ITEM (layer), layer->layer_offset_node);
/* the layer mask's offset node */
layer->mask_offset_node = gegl_node_new_child (node,
"operation", "gegl:translate",
NULL);
gimp_item_add_offset_node (GIMP_ITEM (layer), layer->mask_offset_node);
if (! source_node_hijacked)
{ {
gegl_node_connect_to (source, "output", gegl_node_connect_to (source, "output",
layer->opacity_node, "input"); layer->layer_offset_node, "input");
}
if (! (layer->mask && gimp_layer_get_show_mask (layer)))
{
gegl_node_connect_to (layer->layer_offset_node, "output",
mode_node, "aux");
} }
if (layer->mask) if (layer->mask)
@ -893,35 +917,21 @@ gimp_layer_get_node (GimpItem *item)
mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask)); mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask));
gegl_node_connect_to (mask, "output",
layer->mask_offset_node, "input");
if (gimp_layer_get_show_mask (layer)) if (gimp_layer_get_show_mask (layer))
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "input"); mode_node, "aux");
} }
else if (gimp_layer_get_apply_mask (layer)) else if (gimp_layer_get_apply_mask (layer))
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "aux"); mode_node, "aux2");
} }
} }
layer->offset_node = gegl_node_new_child (node,
"operation", "gegl:translate",
NULL);
gimp_item_add_offset_node (GIMP_ITEM (layer), layer->offset_node);
gegl_node_connect_to (layer->opacity_node, "output",
layer->offset_node, "input");
mode_node = gimp_drawable_get_mode_node (drawable);
gimp_gegl_node_set_layer_mode (mode_node,
layer->mode,
TRUE);
gegl_node_connect_to (layer->offset_node, "output",
mode_node, "aux");
return node; return node;
} }
@ -1256,19 +1266,25 @@ gimp_layer_add_mask (GimpLayer *layer,
if (gimp_item_peek_node (GIMP_ITEM (layer))) if (gimp_item_peek_node (GIMP_ITEM (layer)))
{ {
GeglNode *mode_node;
GeglNode *mask; GeglNode *mask;
mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask)); mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask));
gegl_node_connect_to (mask, "output",
layer->mask_offset_node, "input");
if (layer->show_mask) if (layer->show_mask)
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "input"); mode_node, "aux");
} }
else else
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "aux"); mode_node, "aux2");
} }
} }
@ -1589,18 +1605,18 @@ gimp_layer_apply_mask (GimpLayer *layer,
if (gimp_item_peek_node (item)) if (gimp_item_peek_node (item))
{ {
GeglNode *mode_node;
mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
if (layer->show_mask) if (layer->show_mask)
{ {
GeglNode *source; gegl_node_connect_to (layer->layer_offset_node, "output",
mode_node, "aux");
source = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer));
gegl_node_connect_to (source, "output",
layer->opacity_node, "input");
} }
else else
{ {
gegl_node_disconnect (layer->opacity_node, "aux"); gegl_node_disconnect (mode_node, "aux2");
} }
} }
@ -1646,18 +1662,18 @@ gimp_layer_set_apply_mask (GimpLayer *layer,
if (gimp_item_peek_node (GIMP_ITEM (layer)) && if (gimp_item_peek_node (GIMP_ITEM (layer)) &&
! gimp_layer_get_show_mask (layer)) ! gimp_layer_get_show_mask (layer))
{ {
GeglNode *mask; GeglNode *mode_node;
mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask)); mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
if (layer->apply_mask) if (layer->apply_mask)
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "aux"); mode_node, "aux2");
} }
else else
{ {
gegl_node_disconnect (layer->opacity_node, "aux"); gegl_node_disconnect (mode_node, "aux2");
} }
} }
@ -1724,30 +1740,26 @@ gimp_layer_set_show_mask (GimpLayer *layer,
if (gimp_item_peek_node (GIMP_ITEM (layer))) if (gimp_item_peek_node (GIMP_ITEM (layer)))
{ {
GeglNode *mask; GeglNode *mode_node;
mask = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer->mask)); mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
if (layer->show_mask) if (layer->show_mask)
{ {
gegl_node_disconnect (layer->opacity_node, "aux"); gegl_node_disconnect (mode_node, "aux2");
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "input"); mode_node, "aux");
} }
else else
{ {
GeglNode *source; gegl_node_connect_to (layer->layer_offset_node, "outout",
mode_node, "aux");
source = gimp_drawable_get_source_node (GIMP_DRAWABLE (layer));
gegl_node_connect_to (source, "output",
layer->opacity_node, "input");
if (gimp_layer_get_apply_mask (layer)) if (gimp_layer_get_apply_mask (layer))
{ {
gegl_node_connect_to (mask, "output", gegl_node_connect_to (layer->mask_offset_node, "output",
layer->opacity_node, "aux"); mode_node, "aux2");
} }
} }
} }
@ -1929,7 +1941,7 @@ gimp_layer_set_opacity (GimpLayer *layer,
if (gimp_item_peek_node (GIMP_ITEM (layer))) if (gimp_item_peek_node (GIMP_ITEM (layer)))
{ {
gegl_node_set (layer->opacity_node, gegl_node_set (gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer)),
"value", layer->opacity, "value", layer->opacity,
NULL); NULL);
} }

View File

@ -45,8 +45,8 @@ struct _GimpLayer
gboolean edit_mask; /* edit mask or layer? */ gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show mask or layer? */ gboolean show_mask; /* show mask or layer? */
GeglNode *opacity_node; GeglNode *layer_offset_node;
GeglNode *offset_node; GeglNode *mask_offset_node;
/* Floating selections */ /* Floating selections */
struct struct