[gimp] app: skip cache and format conversion when merging a drawable filter
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: skip cache and format conversion when merging a drawable filter
- Date: Mon, 25 Mar 2019 13:02:59 +0000 (UTC)
commit 733a6ec01c53ec7c2be26e9af3da7b0c8b4c9497
Author: Ell <ell_se yahoo com>
Date: Mon Mar 25 08:58:03 2019 -0400
app: skip cache and format conversion when merging a drawable filter
In gimp_drawable_merge_filter(), disable the filter applicator's
cache and output-format conversion nodes before processing the
uncached region of the filter, so that the result is written
directly to the drawable's buffer.
app/core/gimpdrawable-filters.c | 26 ++++++++++++++++++++++----
app/core/gimpdrawable-operation.c | 8 +-------
app/gegl/gimpapplicator.c | 16 ++++++++++++++++
app/gegl/gimpapplicator.h | 2 ++
4 files changed, 41 insertions(+), 11 deletions(-)
---
diff --git a/app/core/gimpdrawable-filters.c b/app/core/gimpdrawable-filters.c
index 8c0421cf76..bd37645959 100644
--- a/app/core/gimpdrawable-filters.c
+++ b/app/core/gimpdrawable-filters.c
@@ -113,13 +113,15 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
{
GimpImage *image;
GimpApplicator *applicator;
+ gboolean applicator_cache = FALSE;
+ const Babl *applicator_output_format = NULL;
GeglBuffer *undo_buffer;
GeglRectangle undo_rect;
- GeglBuffer *cache = NULL;
- GeglRectangle *rects = NULL;
- gint n_rects = 0;
+ GeglBuffer *cache = NULL;
+ GeglRectangle *rects = NULL;
+ gint n_rects = 0;
GeglRectangle rect;
- gboolean success = TRUE;
+ gboolean success = TRUE;
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE);
g_return_val_if_fail (GIMP_IS_FILTER (filter), FALSE);
@@ -149,6 +151,16 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
*/
cache = gimp_applicator_get_cache_buffer (applicator,
&rects, &n_rects);
+
+ /* skip the cache and output-format conversion while processing
+ * the remaining area, so that the result is written directly to
+ * the drawable's buffer.
+ */
+ applicator_cache = gimp_applicator_get_cache (applicator);
+ applicator_output_format = gimp_applicator_get_output_format (applicator);
+
+ gimp_applicator_set_cache (applicator, FALSE);
+ gimp_applicator_set_output_format (applicator, NULL);
}
gimp_gegl_rectangle_align_to_tile_grid (
@@ -206,6 +218,12 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
g_free (rects);
}
+ if (applicator)
+ {
+ gimp_applicator_set_cache (applicator, applicator_cache);
+ gimp_applicator_set_output_format (applicator, applicator_output_format);
+ }
+
gimp_drawable_update (drawable,
rect.x, rect.y,
rect.width, rect.height);
diff --git a/app/core/gimpdrawable-operation.c b/app/core/gimpdrawable-operation.c
index 76c13b20a1..d4994fa3b4 100644
--- a/app/core/gimpdrawable-operation.c
+++ b/app/core/gimpdrawable-operation.c
@@ -27,8 +27,6 @@
#include "core-types.h"
-#include "gegl/gimpapplicator.h"
-
#include "gimpdrawable.h"
#include "gimpdrawable-operation.h"
#include "gimpdrawablefilter.h"
@@ -45,7 +43,6 @@ gimp_drawable_apply_operation (GimpDrawable *drawable,
GeglNode *operation)
{
GimpDrawableFilter *filter;
- GimpApplicator *applicator;
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
@@ -59,10 +56,7 @@ gimp_drawable_apply_operation (GimpDrawable *drawable,
return;
}
- filter = gimp_drawable_filter_new (drawable, undo_desc, operation, NULL);
- applicator = gimp_filter_get_applicator (GIMP_FILTER (filter));
-
- gimp_applicator_set_cache (applicator, FALSE);
+ filter = gimp_drawable_filter_new (drawable, undo_desc, operation, NULL);
gimp_drawable_filter_apply (filter, NULL);
gimp_drawable_filter_commit (filter, progress, TRUE);
diff --git a/app/gegl/gimpapplicator.c b/app/gegl/gimpapplicator.c
index d1c85b50d0..5cfeb0ec79 100644
--- a/app/gegl/gimpapplicator.c
+++ b/app/gegl/gimpapplicator.c
@@ -494,6 +494,14 @@ gimp_applicator_set_output_format (GimpApplicator *applicator,
}
}
+const Babl *
+gimp_applicator_get_output_format (GimpApplicator *applicator)
+{
+ g_return_val_if_fail (GIMP_IS_APPLICATOR (applicator), NULL);
+
+ return applicator->output_format;
+}
+
void
gimp_applicator_set_cache (GimpApplicator *applicator,
gboolean enable)
@@ -519,6 +527,14 @@ gimp_applicator_set_cache (GimpApplicator *applicator,
}
}
+gboolean
+gimp_applicator_get_cache (GimpApplicator *applicator)
+{
+ g_return_val_if_fail (GIMP_IS_APPLICATOR (applicator), FALSE);
+
+ return applicator->cache_enabled;
+}
+
gboolean gegl_buffer_list_valid_rectangles (GeglBuffer *buffer,
GeglRectangle **rectangles,
gint *n_rectangles);
diff --git a/app/gegl/gimpapplicator.h b/app/gegl/gimpapplicator.h
index 3c70944f2b..a981999c13 100644
--- a/app/gegl/gimpapplicator.h
+++ b/app/gegl/gimpapplicator.h
@@ -121,9 +121,11 @@ void gimp_applicator_set_affect (GimpApplicator *applicator
void gimp_applicator_set_output_format (GimpApplicator *applicator,
const Babl *format);
+const Babl * gimp_applicator_get_output_format (GimpApplicator *applicator);
void gimp_applicator_set_cache (GimpApplicator *applicator,
gboolean enable);
+gboolean gimp_applicator_get_cache (GimpApplicator *applicator);
GeglBuffer * gimp_applicator_get_cache_buffer (GimpApplicator *applicator,
GeglRectangle **rectangles,
gint *n_rectangles);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]