app: add gimp_applicator_set_active()

... which allows temporarily turning the applicator into a NOP,
without destroying cached data.

This commit also improves gimp_applicator_set_{src,dest}_buffer().
This commit is contained in:
Ell 2020-04-02 18:46:41 +03:00
parent 878804fb01
commit e324e2d4b3
2 changed files with 33 additions and 18 deletions

View File

@ -57,6 +57,7 @@ gimp_applicator_class_init (GimpApplicatorClass *klass)
static void static void
gimp_applicator_init (GimpApplicator *applicator) gimp_applicator_init (GimpApplicator *applicator)
{ {
applicator->active = TRUE;
applicator->opacity = 1.0; applicator->opacity = 1.0;
applicator->paint_mode = GIMP_LAYER_MODE_NORMAL; applicator->paint_mode = GIMP_LAYER_MODE_NORMAL;
applicator->blend_space = GIMP_LAYER_COLOR_SPACE_AUTO; applicator->blend_space = GIMP_LAYER_COLOR_SPACE_AUTO;
@ -202,6 +203,23 @@ gimp_applicator_new (GeglNode *parent)
return applicator; return applicator;
} }
void
gimp_applicator_set_active (GimpApplicator *applicator,
gboolean active)
{
g_return_if_fail (GIMP_IS_APPLICATOR (applicator));
if (active != applicator->active)
{
applicator->active = active;
if (active)
gegl_node_link (applicator->crop_node, applicator->output_node);
else
gegl_node_link (applicator->input_node, applicator->output_node);
}
}
void void
gimp_applicator_set_src_buffer (GimpApplicator *applicator, gimp_applicator_set_src_buffer (GimpApplicator *applicator,
GeglBuffer *src_buffer) GeglBuffer *src_buffer)
@ -230,19 +248,15 @@ gimp_applicator_set_src_buffer (GimpApplicator *applicator,
} }
if (! applicator->src_buffer) if (! applicator->src_buffer)
{ gegl_node_link (applicator->src_node, applicator->input_node);
gegl_node_connect_to (applicator->src_node, "output",
applicator->mode_node, "input");
gegl_node_connect_to (applicator->src_node, "output",
applicator->affect_node, "input");
}
} }
else if (applicator->src_buffer) else if (applicator->src_buffer)
{ {
gegl_node_connect_to (applicator->input_node, "output", gegl_node_disconnect (applicator->input_node, "input");
applicator->mode_node, "input");
gegl_node_connect_to (applicator->input_node, "output", gegl_node_set (applicator->src_node,
applicator->affect_node, "input"); "buffer", NULL,
NULL);
} }
applicator->src_buffer = src_buffer; applicator->src_buffer = src_buffer;
@ -276,19 +290,15 @@ gimp_applicator_set_dest_buffer (GimpApplicator *applicator,
} }
if (! applicator->dest_buffer) if (! applicator->dest_buffer)
{ gegl_node_link (applicator->affect_node, applicator->dest_node);
gegl_node_disconnect (applicator->output_node, "input");
gegl_node_connect_to (applicator->affect_node, "output",
applicator->dest_node, "input");
}
} }
else if (applicator->dest_buffer) else if (applicator->dest_buffer)
{ {
gegl_node_disconnect (applicator->dest_node, "input"); gegl_node_disconnect (applicator->dest_node, "input");
gegl_node_connect_to (applicator->affect_node, "output", gegl_node_set (applicator->dest_node,
applicator->output_node, "input"); "buffer", NULL,
NULL);
} }
applicator->dest_buffer = dest_buffer; applicator->dest_buffer = dest_buffer;

View File

@ -41,6 +41,8 @@ struct _GimpApplicator
GeglNode *aux_node; GeglNode *aux_node;
GeglNode *output_node; GeglNode *output_node;
gboolean active;
GeglBuffer *apply_buffer; GeglBuffer *apply_buffer;
GeglNode *apply_src_node; GeglNode *apply_src_node;
@ -92,6 +94,9 @@ GType gimp_applicator_get_type (void) G_GNUC_CONST;
GimpApplicator * gimp_applicator_new (GeglNode *parent); GimpApplicator * gimp_applicator_new (GeglNode *parent);
void gimp_applicator_set_active (GimpApplicator *applicator,
gboolean active);
void gimp_applicator_set_src_buffer (GimpApplicator *applicator, void gimp_applicator_set_src_buffer (GimpApplicator *applicator,
GeglBuffer *dest_buffer); GeglBuffer *dest_buffer);
void gimp_applicator_set_dest_buffer (GimpApplicator *applicator, void gimp_applicator_set_dest_buffer (GimpApplicator *applicator,