From 7ec033d89665c237345d0029eda8bc45fcfcd94c Mon Sep 17 00:00:00 2001 From: Ell Date: Thu, 2 Apr 2020 18:49:00 +0300 Subject: [PATCH] app: add gimp_drawable_filter_set_preview() ... which allows enabling/disabling the filter's preview, without destroying cached data. --- app/core/gimpdrawablefilter.c | 73 ++++++++++++++++++++++++++++------- app/core/gimpdrawablefilter.h | 2 + 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/app/core/gimpdrawablefilter.c b/app/core/gimpdrawablefilter.c index 3c28f110c7..2ad35a6838 100644 --- a/app/core/gimpdrawablefilter.c +++ b/app/core/gimpdrawablefilter.c @@ -68,6 +68,7 @@ struct _GimpDrawableFilter GimpFilterRegion region; gboolean crop_enabled; GeglRectangle crop_rect; + gboolean preview_enabled; gboolean preview_split_enabled; GimpAlignmentType preview_split_alignment; gdouble preview_split_position; @@ -97,6 +98,7 @@ struct _GimpDrawableFilter static void gimp_drawable_filter_dispose (GObject *object); static void gimp_drawable_filter_finalize (GObject *object); +static void gimp_drawable_filter_sync_active (GimpDrawableFilter *filter); static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter, gboolean sync_region); static void gimp_drawable_filter_sync_region (GimpDrawableFilter *filter); @@ -114,7 +116,8 @@ static void gimp_drawable_filter_sync_format (GimpDrawableFilter static void gimp_drawable_filter_sync_mask (GimpDrawableFilter *filter); static void gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter); -static gboolean gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter); +static gboolean gimp_drawable_filter_is_added (GimpDrawableFilter *filter); +static gboolean gimp_drawable_filter_is_active (GimpDrawableFilter *filter); static gboolean gimp_drawable_filter_add_filter (GimpDrawableFilter *filter); static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter); @@ -165,6 +168,7 @@ gimp_drawable_filter_init (GimpDrawableFilter *drawable_filter) { drawable_filter->clip = TRUE; drawable_filter->region = GIMP_FILTER_REGION_SELECTION; + drawable_filter->preview_enabled = TRUE; drawable_filter->preview_split_enabled = FALSE; drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT; drawable_filter->preview_split_position = 1.0; @@ -304,7 +308,7 @@ gimp_drawable_filter_set_region (GimpDrawableFilter *filter, gimp_drawable_filter_sync_region (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -342,6 +346,27 @@ gimp_drawable_filter_set_crop (GimpDrawableFilter *filter, } } +void +gimp_drawable_filter_set_preview (GimpDrawableFilter *filter, + gboolean enabled) +{ + g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter)); + + if (enabled != filter->preview_enabled) + { + filter->preview_enabled = enabled; + + gimp_drawable_filter_sync_active (filter); + + if (gimp_drawable_filter_is_added (filter)) + { + gimp_drawable_update_bounding_box (filter->drawable); + + gimp_drawable_filter_update_drawable (filter, NULL); + } + } +} + void gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter, gboolean enabled, @@ -390,7 +415,7 @@ gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter, gimp_drawable_filter_sync_opacity (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -416,7 +441,7 @@ gimp_drawable_filter_set_mode (GimpDrawableFilter *filter, gimp_drawable_filter_sync_mode (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -433,7 +458,7 @@ gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter, gimp_drawable_filter_sync_format (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -450,7 +475,7 @@ gimp_drawable_filter_set_gamma_hack (GimpDrawableFilter *filter, gimp_drawable_filter_sync_gamma_hack (filter); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -469,7 +494,7 @@ gimp_drawable_filter_set_override_constraints (GimpDrawableFilter *filter, gimp_drawable_filter_sync_format (filter); gimp_drawable_filter_sync_clip (filter, TRUE); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) gimp_drawable_filter_update_drawable (filter, NULL); } } @@ -485,9 +510,12 @@ gimp_drawable_filter_apply (GimpDrawableFilter *filter, gimp_drawable_filter_sync_clip (filter, TRUE); - gimp_drawable_update_bounding_box (filter->drawable); + if (gimp_drawable_filter_is_active (filter)) + { + gimp_drawable_update_bounding_box (filter->drawable); - gimp_drawable_filter_update_drawable (filter, area); + gimp_drawable_filter_update_drawable (filter, area); + } } gboolean @@ -502,7 +530,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter, FALSE); g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), FALSE); - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_added (filter)) { const Babl *format; @@ -511,6 +539,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter, gimp_drawable_filter_set_preview_split (filter, FALSE, filter->preview_split_alignment, filter->preview_split_position); + gimp_drawable_filter_set_preview (filter, TRUE); success = gimp_drawable_merge_filter (filter->drawable, GIMP_FILTER (filter), @@ -546,6 +575,12 @@ gimp_drawable_filter_abort (GimpDrawableFilter *filter) /* private functions */ +static void +gimp_drawable_filter_sync_active (GimpDrawableFilter *filter) +{ + gimp_applicator_set_active (filter->applicator, filter->preview_enabled); +} + static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter, gboolean sync_region) @@ -663,7 +698,7 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter) gimp_applicator_set_apply_offset (filter->applicator, 0, 0); } - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_active (filter)) { if (gimp_drawable_update_bounding_box (filter->drawable)) g_signal_emit (filter, drawable_filter_signals[FLUSH], 0); @@ -761,7 +796,7 @@ gimp_drawable_filter_sync_crop (GimpDrawableFilter *filter, gimp_applicator_set_crop (filter->applicator, enabled ? &new_rect : NULL); if (update && - gimp_drawable_filter_is_filtering (filter) && + gimp_drawable_filter_is_active (filter) && ! gegl_rectangle_equal (&old_rect, &new_rect)) { GeglRectangle diff_rects[4]; @@ -926,21 +961,29 @@ gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter) } static gboolean -gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter) +gimp_drawable_filter_is_added (GimpDrawableFilter *filter) { return gimp_drawable_has_filter (filter->drawable, GIMP_FILTER (filter)); } +static gboolean +gimp_drawable_filter_is_active (GimpDrawableFilter *filter) +{ + return gimp_drawable_filter_is_added (filter) && + filter->preview_enabled; +} + static gboolean gimp_drawable_filter_add_filter (GimpDrawableFilter *filter) { - if (! gimp_drawable_filter_is_filtering (filter)) + if (! gimp_drawable_filter_is_added (filter)) { GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable)); gimp_viewable_preview_freeze (GIMP_VIEWABLE (filter->drawable)); + gimp_drawable_filter_sync_active (filter); gimp_drawable_filter_sync_mask (filter); gimp_drawable_filter_sync_clip (filter, FALSE); gimp_drawable_filter_sync_region (filter); @@ -994,7 +1037,7 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter) static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter) { - if (gimp_drawable_filter_is_filtering (filter)) + if (gimp_drawable_filter_is_added (filter)) { GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable)); diff --git a/app/core/gimpdrawablefilter.h b/app/core/gimpdrawablefilter.h index 84adff9fe4..2bd4812074 100644 --- a/app/core/gimpdrawablefilter.h +++ b/app/core/gimpdrawablefilter.h @@ -62,6 +62,8 @@ void gimp_drawable_filter_set_region (GimpDrawableFilter *filter, void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter, const GeglRectangle *rect, gboolean update); +void gimp_drawable_filter_set_preview (GimpDrawableFilter *filter, + gboolean enabled); void gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter, gboolean enabled,