[gimp] app: make painting with applicator working in multi-drawable mode.
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: make painting with applicator working in multi-drawable mode.
- Date: Tue, 14 Sep 2021 16:11:59 +0000 (UTC)
commit d5670644b4e283569ed5cb3aea112466f30d0096
Author: Jehan <jehan girinstud io>
Date: Thu Sep 2 01:15:30 2021 +0200
app: make painting with applicator working in multi-drawable mode.
app/paint/gimppaintbrush.c | 2 +-
app/paint/gimppaintcore.c | 77 +++++++++++++++++++++++++++++-----------------
app/paint/gimppaintcore.h | 2 +-
3 files changed, 51 insertions(+), 30 deletions(-)
---
diff --git a/app/paint/gimppaintbrush.c b/app/paint/gimppaintbrush.c
index 075eb3d753..00ff607a3e 100644
--- a/app/paint/gimppaintbrush.c
+++ b/app/paint/gimppaintbrush.c
@@ -334,7 +334,7 @@ _gimp_paintbrush_motion (GimpPaintCore *paint_core,
* (unless using an applicator, which currently modifies the paint buffer
* in-place).
*/
- if (paint_core->applicator ||
+ if (paint_core->applicators ||
paint_buffer != paintbrush->paint_buffer ||
paint_pixmap != paintbrush->paint_pixmap ||
(! paint_pixmap && (gimp_rgba_distance (&paint_color,
diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c
index 14b3470701..7d01608a07 100644
--- a/app/paint/gimppaintcore.c
+++ b/app/paint/gimppaintcore.c
@@ -166,6 +166,8 @@ gimp_paint_core_finalize (GObject *object)
g_clear_pointer (&core->undo_desc, g_free);
g_hash_table_unref (core->undo_buffers);
+ if (core->applicators)
+ g_hash_table_unref (core->applicators);
if (core->stroke_buffer)
{
@@ -379,6 +381,11 @@ gimp_paint_core_start (GimpPaintCore *core,
core->start_coords = core->last_coords;
core->cur_coords = *coords;
+ if (paint_options->use_applicator)
+ core->applicators = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
+ else
+ core->applicators = NULL;
+
if (! GIMP_PAINT_CORE_GET_CLASS (core)->start (core, drawables,
paint_options,
coords, error))
@@ -449,20 +456,23 @@ gimp_paint_core_start (GimpPaintCore *core,
if (paint_options->use_applicator)
{
- core->applicator = gimp_applicator_new (NULL);
+ GimpApplicator *applicator;
+
+ applicator = gimp_applicator_new (NULL);
+ g_hash_table_insert (core->applicators, iter->data, applicator);
if (core->mask_buffer)
{
- gimp_applicator_set_mask_buffer (core->applicator,
+ gimp_applicator_set_mask_buffer (applicator,
core->mask_buffer);
- gimp_applicator_set_mask_offset (core->applicator,
+ gimp_applicator_set_mask_offset (applicator,
core->mask_x_offset,
core->mask_y_offset);
}
- gimp_applicator_set_affect (core->applicator,
+ gimp_applicator_set_affect (applicator,
gimp_drawable_get_active_mask (iter->data));
- gimp_applicator_set_dest_buffer (core->applicator,
+ gimp_applicator_set_dest_buffer (applicator,
gimp_drawable_get_buffer (iter->data));
}
@@ -483,7 +493,11 @@ gimp_paint_core_finish (GimpPaintCore *core,
g_return_if_fail (GIMP_IS_PAINT_CORE (core));
- g_clear_object (&core->applicator);
+ if (core->applicators)
+ {
+ g_hash_table_unref (core->applicators);
+ core->applicators = NULL;
+ }
if (core->stroke_buffer)
{
@@ -847,8 +861,12 @@ gimp_paint_core_paste (GimpPaintCore *core,
if (! affect)
return;
- if (core->applicator)
+ if (core->applicators)
{
+ GimpApplicator *applicator;
+
+ applicator = g_hash_table_lookup (core->applicators, drawable);
+
/* If the mode is CONSTANT:
* combine the canvas buffer and the paint mask to the paint buffer
*/
@@ -884,7 +902,7 @@ gimp_paint_core_paste (GimpPaintCore *core,
GEGL_RECTANGLE (0, 0, width, height),
1.0);
- gimp_applicator_set_src_buffer (core->applicator, undo_buffer);
+ gimp_applicator_set_src_buffer (applicator, undo_buffer);
}
/* Otherwise:
* combine the paint mask to the paint buffer directly
@@ -904,24 +922,24 @@ gimp_paint_core_paste (GimpPaintCore *core,
g_object_unref (paint_mask_buffer);
- gimp_applicator_set_src_buffer (core->applicator,
+ gimp_applicator_set_src_buffer (applicator,
gimp_drawable_get_buffer (drawable));
}
- gimp_applicator_set_apply_buffer (core->applicator,
+ gimp_applicator_set_apply_buffer (applicator,
core->paint_buffer);
- gimp_applicator_set_apply_offset (core->applicator,
+ gimp_applicator_set_apply_offset (applicator,
core->paint_buffer_x,
core->paint_buffer_y);
- gimp_applicator_set_opacity (core->applicator, image_opacity);
- gimp_applicator_set_mode (core->applicator, paint_mode,
+ gimp_applicator_set_opacity (applicator, image_opacity);
+ gimp_applicator_set_mode (applicator, paint_mode,
GIMP_LAYER_COLOR_SPACE_AUTO,
GIMP_LAYER_COLOR_SPACE_AUTO,
gimp_layer_mode_get_paint_composite_mode (paint_mode));
/* apply the paint area to the image */
- gimp_applicator_blit (core->applicator,
+ gimp_applicator_blit (applicator,
GEGL_RECTANGLE (core->paint_buffer_x,
core->paint_buffer_y,
width, height));
@@ -1057,10 +1075,13 @@ gimp_paint_core_replace (GimpPaintCore *core,
undo_buffer = g_hash_table_lookup (core->undo_buffers, drawable);
- if (core->applicator)
+ if (core->applicators)
{
- GeglRectangle mask_rect;
- GeglBuffer *mask_buffer;
+ GimpApplicator *applicator;
+ GeglRectangle mask_rect;
+ GeglBuffer *mask_buffer;
+
+ applicator = g_hash_table_lookup (core->applicators, drawable);
/* If the mode is CONSTANT:
* combine the paint mask to the canvas buffer, and use it as the mask
@@ -1095,7 +1116,7 @@ gimp_paint_core_replace (GimpPaintCore *core,
core->paint_buffer_y,
width, height);
- gimp_applicator_set_src_buffer (core->applicator, undo_buffer);
+ gimp_applicator_set_src_buffer (applicator, undo_buffer);
}
/* Otherwise:
* use the paint mask as the mask buffer directly
@@ -1108,7 +1129,7 @@ gimp_paint_core_replace (GimpPaintCore *core,
paint_mask_offset_y,
width, height);
- gimp_applicator_set_src_buffer (core->applicator,
+ gimp_applicator_set_src_buffer (applicator,
gimp_drawable_get_buffer (drawable));
}
@@ -1152,32 +1173,32 @@ gimp_paint_core_replace (GimpPaintCore *core,
mask_rect = combined_mask_rect;
}
- gimp_applicator_set_mask_buffer (core->applicator, mask_buffer);
- gimp_applicator_set_mask_offset (core->applicator,
+ gimp_applicator_set_mask_buffer (applicator, mask_buffer);
+ gimp_applicator_set_mask_offset (applicator,
core->paint_buffer_x - mask_rect.x,
core->paint_buffer_y - mask_rect.y);
- gimp_applicator_set_apply_buffer (core->applicator,
+ gimp_applicator_set_apply_buffer (applicator,
core->paint_buffer);
- gimp_applicator_set_apply_offset (core->applicator,
+ gimp_applicator_set_apply_offset (applicator,
core->paint_buffer_x,
core->paint_buffer_y);
- gimp_applicator_set_opacity (core->applicator, image_opacity);
- gimp_applicator_set_mode (core->applicator, GIMP_LAYER_MODE_REPLACE,
+ gimp_applicator_set_opacity (applicator, image_opacity);
+ gimp_applicator_set_mode (applicator, GIMP_LAYER_MODE_REPLACE,
GIMP_LAYER_COLOR_SPACE_AUTO,
GIMP_LAYER_COLOR_SPACE_AUTO,
gimp_layer_mode_get_paint_composite_mode (
GIMP_LAYER_MODE_REPLACE));
/* apply the paint area to the image */
- gimp_applicator_blit (core->applicator,
+ gimp_applicator_blit (applicator,
GEGL_RECTANGLE (core->paint_buffer_x,
core->paint_buffer_y,
width, height));
- gimp_applicator_set_mask_buffer (core->applicator, core->mask_buffer);
- gimp_applicator_set_mask_offset (core->applicator,
+ gimp_applicator_set_mask_buffer (applicator, core->mask_buffer);
+ gimp_applicator_set_mask_offset (applicator,
core->mask_x_offset,
core->mask_y_offset);
diff --git a/app/paint/gimppaintcore.h b/app/paint/gimppaintcore.h
index 189fec8f6e..eb6a58763f 100644
--- a/app/paint/gimppaintcore.h
+++ b/app/paint/gimppaintcore.h
@@ -70,7 +70,7 @@ struct _GimpPaintCore
gint mask_x_offset;
gint mask_y_offset;
- GimpApplicator *applicator;
+ GHashTable *applicators;
GArray *stroke_buffer;
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]