add a projection node and implement GimpDrawable::get_node(). Reconfigure
2008-10-11 Michael Natterer <mitch@gimp.org> * app/core/gimpchannel.[ch]: add a projection node and implement GimpDrawable::get_node(). Reconfigure the node in visibility_changed(), set_color(), set_opacity() and set_show_masked(). * app/core/gimpimage.c (gimp_image_get_graph): enable code that projects the channels stack on top of the layer stack. * app/core/gimpprojection-construct.c: remove the call to gimp_projection_construct_channels() from the GEGL code path. Also don't touch proj->construct_flag. svn path=/trunk/; revision=27230
This commit is contained in:

committed by
Michael Natterer

parent
e28e864ac6
commit
0e88239524
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
||||
2008-10-11 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* app/core/gimpchannel.[ch]: add a projection node and
|
||||
implement GimpDrawable::get_node(). Reconfigure the node in
|
||||
visibility_changed(), set_color(), set_opacity() and
|
||||
set_show_masked().
|
||||
|
||||
* app/core/gimpimage.c (gimp_image_get_graph): enable code that
|
||||
projects the channels stack on top of the layer stack.
|
||||
|
||||
* app/core/gimpprojection-construct.c: remove the call to
|
||||
gimp_projection_construct_channels() from the GEGL code path. Also
|
||||
don't touch proj->construct_flag.
|
||||
|
||||
2008-10-11 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* app/core/gimplayer.c (gimp_layer_get_node): remove obsolete
|
||||
|
@ -65,6 +65,13 @@ enum
|
||||
};
|
||||
|
||||
|
||||
#ifdef __GNUC__
|
||||
#warning FIXME: gegl_node_add_child() needs to be public
|
||||
#endif
|
||||
GeglNode * gegl_node_add_child (GeglNode *self,
|
||||
GeglNode *child);
|
||||
|
||||
|
||||
static void gimp_channel_pickable_iface_init (GimpPickableInterface *iface);
|
||||
|
||||
static void gimp_channel_finalize (GObject *object);
|
||||
@ -75,6 +82,7 @@ static gint64 gimp_channel_get_memsize (GimpObject *object,
|
||||
static gchar * gimp_channel_get_description (GimpViewable *viewable,
|
||||
gchar **tooltip);
|
||||
|
||||
static void gimp_channel_visibility_changed (GimpItem *item);
|
||||
static gboolean gimp_channel_is_attached (GimpItem *item);
|
||||
static GimpItem * gimp_channel_duplicate (GimpItem *item,
|
||||
GType new_type);
|
||||
@ -150,6 +158,7 @@ static void gimp_channel_set_tiles (GimpDrawable *drawable,
|
||||
GimpImageType type,
|
||||
gint offset_x,
|
||||
gint offset_y);
|
||||
static GeglNode * gimp_channel_get_node (GimpDrawable *drawable);
|
||||
static void gimp_channel_swap_pixels (GimpDrawable *drawable,
|
||||
TileManager *tiles,
|
||||
gboolean sparse,
|
||||
@ -244,31 +253,33 @@ gimp_channel_class_init (GimpChannelClass *klass)
|
||||
viewable_class->get_description = gimp_channel_get_description;
|
||||
viewable_class->default_stock_id = "gimp-channel";
|
||||
|
||||
item_class->is_attached = gimp_channel_is_attached;
|
||||
item_class->duplicate = gimp_channel_duplicate;
|
||||
item_class->convert = gimp_channel_convert;
|
||||
item_class->translate = gimp_channel_translate;
|
||||
item_class->scale = gimp_channel_scale;
|
||||
item_class->resize = gimp_channel_resize;
|
||||
item_class->flip = gimp_channel_flip;
|
||||
item_class->rotate = gimp_channel_rotate;
|
||||
item_class->transform = gimp_channel_transform;
|
||||
item_class->stroke = gimp_channel_stroke;
|
||||
item_class->default_name = _("Channel");
|
||||
item_class->rename_desc = _("Rename Channel");
|
||||
item_class->translate_desc = _("Move Channel");
|
||||
item_class->scale_desc = _("Scale Channel");
|
||||
item_class->resize_desc = _("Resize Channel");
|
||||
item_class->flip_desc = _("Flip Channel");
|
||||
item_class->rotate_desc = _("Rotate Channel");
|
||||
item_class->transform_desc = _("Transform Channel");
|
||||
item_class->stroke_desc = _("Stroke Channel");
|
||||
item_class->visibility_changed = gimp_channel_visibility_changed;
|
||||
item_class->is_attached = gimp_channel_is_attached;
|
||||
item_class->duplicate = gimp_channel_duplicate;
|
||||
item_class->convert = gimp_channel_convert;
|
||||
item_class->translate = gimp_channel_translate;
|
||||
item_class->scale = gimp_channel_scale;
|
||||
item_class->resize = gimp_channel_resize;
|
||||
item_class->flip = gimp_channel_flip;
|
||||
item_class->rotate = gimp_channel_rotate;
|
||||
item_class->transform = gimp_channel_transform;
|
||||
item_class->stroke = gimp_channel_stroke;
|
||||
item_class->default_name = _("Channel");
|
||||
item_class->rename_desc = _("Rename Channel");
|
||||
item_class->translate_desc = _("Move Channel");
|
||||
item_class->scale_desc = _("Scale Channel");
|
||||
item_class->resize_desc = _("Resize Channel");
|
||||
item_class->flip_desc = _("Flip Channel");
|
||||
item_class->rotate_desc = _("Rotate Channel");
|
||||
item_class->transform_desc = _("Transform Channel");
|
||||
item_class->stroke_desc = _("Stroke Channel");
|
||||
|
||||
drawable_class->invalidate_boundary = gimp_channel_invalidate_boundary;
|
||||
drawable_class->get_active_components = gimp_channel_get_active_components;
|
||||
drawable_class->apply_region = gimp_channel_apply_region;
|
||||
drawable_class->replace_region = gimp_channel_replace_region;
|
||||
drawable_class->set_tiles = gimp_channel_set_tiles;
|
||||
drawable_class->get_node = gimp_channel_get_node;
|
||||
drawable_class->swap_pixels = gimp_channel_swap_pixels;
|
||||
|
||||
klass->boundary = gimp_channel_real_boundary;
|
||||
@ -325,6 +336,12 @@ gimp_channel_finalize (GObject *object)
|
||||
{
|
||||
GimpChannel *channel = GIMP_CHANNEL (object);
|
||||
|
||||
if (channel->node)
|
||||
{
|
||||
g_object_unref (channel->node);
|
||||
channel->node = NULL;
|
||||
}
|
||||
|
||||
if (channel->segs_in)
|
||||
{
|
||||
g_free (channel->segs_in);
|
||||
@ -366,6 +383,39 @@ gimp_channel_get_description (GimpViewable *viewable,
|
||||
tooltip);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_channel_visibility_changed (GimpItem *item)
|
||||
{
|
||||
GimpChannel *channel = GIMP_CHANNEL (item);
|
||||
|
||||
if (channel->node)
|
||||
{
|
||||
GeglNode *input;
|
||||
GeglNode *output;
|
||||
|
||||
input = gegl_node_get_input_proxy (channel->node, "input");
|
||||
output = gegl_node_get_output_proxy (channel->node, "output");
|
||||
|
||||
if (gimp_item_get_visible (item))
|
||||
{
|
||||
gegl_node_connect_to (input, "output",
|
||||
channel->mode_node, "input");
|
||||
gegl_node_connect_to (channel->mode_node, "output",
|
||||
output, "input");
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_node_disconnect (channel->mode_node, "input");
|
||||
|
||||
gegl_node_connect_to (input, "output",
|
||||
output, "input");
|
||||
}
|
||||
}
|
||||
|
||||
if (GIMP_ITEM_CLASS (parent_class)->visibility_changed)
|
||||
GIMP_ITEM_CLASS (parent_class)->visibility_changed (item);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_channel_is_attached (GimpItem *item)
|
||||
{
|
||||
@ -822,6 +872,89 @@ gimp_channel_set_tiles (GimpDrawable *drawable,
|
||||
GIMP_CHANNEL (drawable)->bounds_known = FALSE;
|
||||
}
|
||||
|
||||
static GeglNode *
|
||||
gimp_channel_get_node (GimpDrawable *drawable)
|
||||
{
|
||||
GimpChannel *channel = GIMP_CHANNEL (drawable);
|
||||
GeglNode *source;
|
||||
GeglNode *input;
|
||||
GeglNode *output;
|
||||
GeglColor *color;
|
||||
|
||||
g_printerr ("%s 1\n", G_STRFUNC);
|
||||
|
||||
if (channel->node)
|
||||
return channel->node;
|
||||
|
||||
g_printerr ("%s 2\n", G_STRFUNC);
|
||||
|
||||
channel->node = gegl_node_new ();
|
||||
|
||||
source = gimp_drawable_get_source_node (drawable);
|
||||
gegl_node_add_child (channel->node, source);
|
||||
|
||||
color = gegl_color_new (NULL);
|
||||
gegl_color_set_rgba (color,
|
||||
channel->color.r,
|
||||
channel->color.g,
|
||||
channel->color.b,
|
||||
channel->color.a);
|
||||
|
||||
channel->color_node = gegl_node_new_child (channel->node,
|
||||
"operation", "color",
|
||||
"value", color,
|
||||
NULL);
|
||||
|
||||
g_object_unref (color);
|
||||
|
||||
channel->mask_node = gegl_node_new_child (channel->node,
|
||||
"operation", "opacity",
|
||||
NULL);
|
||||
gegl_node_connect_to (channel->color_node, "output",
|
||||
channel->mask_node, "input");
|
||||
|
||||
channel->invert_node = gegl_node_new_child (channel->node,
|
||||
"operation", "invert",
|
||||
NULL);
|
||||
|
||||
if (channel->show_masked)
|
||||
{
|
||||
gegl_node_connect_to (source, "output",
|
||||
channel->invert_node, "input");
|
||||
gegl_node_connect_to (channel->invert_node, "output",
|
||||
channel->mask_node, "aux");
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_node_connect_to (source, "output",
|
||||
channel->mask_node, "aux");
|
||||
}
|
||||
|
||||
channel->mode_node = gegl_node_new_child (channel->node,
|
||||
"operation", "normal",
|
||||
NULL);
|
||||
gegl_node_connect_to (channel->mask_node, "output",
|
||||
channel->mode_node, "aux");
|
||||
|
||||
input = gegl_node_get_input_proxy (channel->node, "input");
|
||||
output = gegl_node_get_output_proxy (channel->node, "output");
|
||||
|
||||
if (gimp_item_get_visible (GIMP_ITEM (channel)))
|
||||
{
|
||||
gegl_node_connect_to (input, "output",
|
||||
channel->mode_node, "input");
|
||||
gegl_node_connect_to (channel->mode_node, "output",
|
||||
output, "input");
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_node_connect_to (input, "output",
|
||||
output, "input");
|
||||
}
|
||||
|
||||
return channel->node;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_channel_swap_pixels (GimpDrawable *drawable,
|
||||
TileManager *tiles,
|
||||
@ -1634,6 +1767,24 @@ gimp_channel_set_color (GimpChannel *channel,
|
||||
|
||||
channel->color = *color;
|
||||
|
||||
if (channel->color_node)
|
||||
{
|
||||
GeglColor *gegl_color;
|
||||
|
||||
gegl_color = gegl_color_new (NULL);
|
||||
gegl_color_set_rgba (gegl_color,
|
||||
channel->color.r,
|
||||
channel->color.g,
|
||||
channel->color.b,
|
||||
channel->color.a);
|
||||
|
||||
gegl_node_set (channel->color_node,
|
||||
"value", gegl_color,
|
||||
NULL);
|
||||
|
||||
g_object_unref (gegl_color);
|
||||
}
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (channel),
|
||||
0, 0,
|
||||
gimp_item_width (GIMP_ITEM (channel)),
|
||||
@ -1682,6 +1833,24 @@ gimp_channel_set_opacity (GimpChannel *channel,
|
||||
|
||||
channel->color.a = opacity;
|
||||
|
||||
if (channel->color_node)
|
||||
{
|
||||
GeglColor *gegl_color;
|
||||
|
||||
gegl_color = gegl_color_new (NULL);
|
||||
gegl_color_set_rgba (gegl_color,
|
||||
channel->color.r,
|
||||
channel->color.g,
|
||||
channel->color.b,
|
||||
channel->color.a);
|
||||
|
||||
gegl_node_set (channel->color_node,
|
||||
"value", gegl_color,
|
||||
NULL);
|
||||
|
||||
g_object_unref (gegl_color);
|
||||
}
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (channel),
|
||||
0, 0,
|
||||
gimp_item_width (GIMP_ITEM (channel)),
|
||||
@ -1709,6 +1878,28 @@ gimp_channel_set_show_masked (GimpChannel *channel,
|
||||
{
|
||||
channel->show_masked = show_masked ? TRUE : FALSE;
|
||||
|
||||
if (channel->invert_node)
|
||||
{
|
||||
GeglNode *source;
|
||||
|
||||
source = gimp_drawable_get_source_node (GIMP_DRAWABLE (channel));
|
||||
|
||||
if (channel->show_masked)
|
||||
{
|
||||
gegl_node_connect_to (source, "output",
|
||||
channel->invert_node, "input");
|
||||
gegl_node_connect_to (channel->invert_node, "output",
|
||||
channel->mask_node, "aux");
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_node_disconnect (channel->invert_node, "input");
|
||||
|
||||
gegl_node_connect_to (source, "output",
|
||||
channel->mask_node, "aux");
|
||||
}
|
||||
}
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (channel),
|
||||
0, 0,
|
||||
gimp_item_width (GIMP_ITEM (channel)),
|
||||
|
@ -40,6 +40,12 @@ struct _GimpChannel
|
||||
gboolean show_masked; /* Show masked areas--as */
|
||||
/* opposed to selected areas */
|
||||
|
||||
GeglNode *node;
|
||||
GeglNode *color_node;
|
||||
GeglNode *invert_node;
|
||||
GeglNode *mask_node;
|
||||
GeglNode *mode_node;
|
||||
|
||||
/* Selection mask variables */
|
||||
gboolean boundary_known; /* is the current boundary valid */
|
||||
BoundSeg *segs_in; /* outline of selected region */
|
||||
|
@ -2549,10 +2549,8 @@ GeglNode *
|
||||
gimp_image_get_graph (GimpImage *image)
|
||||
{
|
||||
GeglNode *layers_node;
|
||||
#if 0
|
||||
GeglNode *channels_node;
|
||||
GeglNode *blend_node;
|
||||
#endif
|
||||
GeglNode *output;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
||||
@ -2567,7 +2565,6 @@ gimp_image_get_graph (GimpImage *image)
|
||||
|
||||
gegl_node_add_child (image->graph, layers_node);
|
||||
|
||||
#if 0
|
||||
channels_node =
|
||||
gimp_drawable_stack_get_graph (GIMP_DRAWABLE_STACK (image->channels));
|
||||
|
||||
@ -2581,17 +2578,11 @@ gimp_image_get_graph (GimpImage *image)
|
||||
blend_node, "input");
|
||||
gegl_node_connect_to (channels_node, "output",
|
||||
blend_node, "aux");
|
||||
#endif
|
||||
|
||||
output = gegl_node_get_output_proxy (image->graph, "output");
|
||||
|
||||
#if 0
|
||||
gegl_node_connect_to (blend_node, "output",
|
||||
output, "input");
|
||||
#else
|
||||
gegl_node_connect_to (layers_node, "output",
|
||||
output, "input");
|
||||
#endif
|
||||
|
||||
return image->graph;
|
||||
}
|
||||
|
@ -143,8 +143,6 @@ gimp_projection_construct (GimpProjection *proj,
|
||||
}
|
||||
#endif
|
||||
|
||||
proj->construct_flag = FALSE;
|
||||
|
||||
/* First, determine if the projection image needs to be
|
||||
* initialized--this is the case when there are no visible
|
||||
* layers that cover the entire canvas--either because layers
|
||||
@ -156,11 +154,16 @@ gimp_projection_construct (GimpProjection *proj,
|
||||
* the list of channels
|
||||
*/
|
||||
if (FALSE)
|
||||
gimp_projection_construct_gegl (proj, x, y, w, h);
|
||||
{
|
||||
gimp_projection_construct_gegl (proj, x, y, w, h);
|
||||
}
|
||||
else
|
||||
gimp_projection_construct_layers (proj, x, y, w, h);
|
||||
{
|
||||
proj->construct_flag = FALSE;
|
||||
|
||||
gimp_projection_construct_channels (proj, x, y, w, h);
|
||||
gimp_projection_construct_layers (proj, x, y, w, h);
|
||||
gimp_projection_construct_channels (proj, x, y, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -189,8 +192,6 @@ gimp_projection_construct_gegl (GimpProjection *proj,
|
||||
while (gegl_processor_work (processor, NULL));
|
||||
|
||||
g_object_unref (processor);
|
||||
|
||||
proj->construct_flag = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user