app: add gimp_drawable_filter_set_preview()
... which allows enabling/disabling the filter's preview, without
destroying cached data.
(cherry picked from commit 7ec033d896
)
This commit is contained in:
@ -69,6 +69,7 @@ struct _GimpDrawableFilter
|
|||||||
GimpFilterRegion region;
|
GimpFilterRegion region;
|
||||||
gboolean crop_enabled;
|
gboolean crop_enabled;
|
||||||
GeglRectangle crop_rect;
|
GeglRectangle crop_rect;
|
||||||
|
gboolean preview_enabled;
|
||||||
gboolean preview_split_enabled;
|
gboolean preview_split_enabled;
|
||||||
GimpAlignmentType preview_split_alignment;
|
GimpAlignmentType preview_split_alignment;
|
||||||
gdouble preview_split_position;
|
gdouble preview_split_position;
|
||||||
@ -100,6 +101,7 @@ struct _GimpDrawableFilter
|
|||||||
static void gimp_drawable_filter_dispose (GObject *object);
|
static void gimp_drawable_filter_dispose (GObject *object);
|
||||||
static void gimp_drawable_filter_finalize (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,
|
static void gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
|
||||||
gboolean sync_region);
|
gboolean sync_region);
|
||||||
static void gimp_drawable_filter_sync_region (GimpDrawableFilter *filter);
|
static void gimp_drawable_filter_sync_region (GimpDrawableFilter *filter);
|
||||||
@ -118,7 +120,8 @@ static void gimp_drawable_filter_sync_mask (GimpDrawableFilter
|
|||||||
static void gimp_drawable_filter_sync_transform (GimpDrawableFilter *filter);
|
static void gimp_drawable_filter_sync_transform (GimpDrawableFilter *filter);
|
||||||
static void gimp_drawable_filter_sync_gamma_hack (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_add_filter (GimpDrawableFilter *filter);
|
||||||
static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter);
|
static gboolean gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter);
|
||||||
|
|
||||||
@ -172,6 +175,7 @@ gimp_drawable_filter_init (GimpDrawableFilter *drawable_filter)
|
|||||||
{
|
{
|
||||||
drawable_filter->clip = TRUE;
|
drawable_filter->clip = TRUE;
|
||||||
drawable_filter->region = GIMP_FILTER_REGION_SELECTION;
|
drawable_filter->region = GIMP_FILTER_REGION_SELECTION;
|
||||||
|
drawable_filter->preview_enabled = TRUE;
|
||||||
drawable_filter->preview_split_enabled = FALSE;
|
drawable_filter->preview_split_enabled = FALSE;
|
||||||
drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT;
|
drawable_filter->preview_split_alignment = GIMP_ALIGN_LEFT;
|
||||||
drawable_filter->preview_split_position = 1.0;
|
drawable_filter->preview_split_position = 1.0;
|
||||||
@ -321,7 +325,7 @@ gimp_drawable_filter_set_region (GimpDrawableFilter *filter,
|
|||||||
|
|
||||||
gimp_drawable_filter_sync_region (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);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,6 +363,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
|
void
|
||||||
gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter,
|
gimp_drawable_filter_set_preview_split (GimpDrawableFilter *filter,
|
||||||
gboolean enabled,
|
gboolean enabled,
|
||||||
@ -407,7 +432,7 @@ gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter,
|
|||||||
|
|
||||||
gimp_drawable_filter_sync_opacity (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);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -433,7 +458,7 @@ gimp_drawable_filter_set_mode (GimpDrawableFilter *filter,
|
|||||||
|
|
||||||
gimp_drawable_filter_sync_mode (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);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -450,7 +475,7 @@ gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
|
|||||||
|
|
||||||
gimp_drawable_filter_sync_format (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);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -485,7 +510,7 @@ gimp_drawable_filter_set_gamma_hack (GimpDrawableFilter *filter,
|
|||||||
gimp_drawable_filter_sync_gamma_hack (filter);
|
gimp_drawable_filter_sync_gamma_hack (filter);
|
||||||
gimp_drawable_filter_sync_transform (filter);
|
gimp_drawable_filter_sync_transform (filter);
|
||||||
|
|
||||||
if (gimp_drawable_filter_is_filtering (filter))
|
if (gimp_drawable_filter_is_active (filter))
|
||||||
gimp_drawable_filter_update_drawable (filter, NULL);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -504,7 +529,7 @@ gimp_drawable_filter_set_override_constraints (GimpDrawableFilter *filter,
|
|||||||
gimp_drawable_filter_sync_format (filter);
|
gimp_drawable_filter_sync_format (filter);
|
||||||
gimp_drawable_filter_sync_clip (filter, TRUE);
|
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);
|
gimp_drawable_filter_update_drawable (filter, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -520,9 +545,12 @@ gimp_drawable_filter_apply (GimpDrawableFilter *filter,
|
|||||||
|
|
||||||
gimp_drawable_filter_sync_clip (filter, TRUE);
|
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
|
gboolean
|
||||||
@ -537,7 +565,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
|
|||||||
FALSE);
|
FALSE);
|
||||||
g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), 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;
|
const Babl *format;
|
||||||
|
|
||||||
@ -546,6 +574,7 @@ gimp_drawable_filter_commit (GimpDrawableFilter *filter,
|
|||||||
gimp_drawable_filter_set_preview_split (filter, FALSE,
|
gimp_drawable_filter_set_preview_split (filter, FALSE,
|
||||||
filter->preview_split_alignment,
|
filter->preview_split_alignment,
|
||||||
filter->preview_split_position);
|
filter->preview_split_position);
|
||||||
|
gimp_drawable_filter_set_preview (filter, TRUE);
|
||||||
|
|
||||||
success = gimp_drawable_merge_filter (filter->drawable,
|
success = gimp_drawable_merge_filter (filter->drawable,
|
||||||
GIMP_FILTER (filter),
|
GIMP_FILTER (filter),
|
||||||
@ -581,6 +610,12 @@ gimp_drawable_filter_abort (GimpDrawableFilter *filter)
|
|||||||
|
|
||||||
/* private functions */
|
/* private functions */
|
||||||
|
|
||||||
|
static void
|
||||||
|
gimp_drawable_filter_sync_active (GimpDrawableFilter *filter)
|
||||||
|
{
|
||||||
|
gimp_applicator_set_active (filter->applicator, filter->preview_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
|
gimp_drawable_filter_sync_clip (GimpDrawableFilter *filter,
|
||||||
gboolean sync_region)
|
gboolean sync_region)
|
||||||
@ -698,7 +733,7 @@ gimp_drawable_filter_sync_region (GimpDrawableFilter *filter)
|
|||||||
gimp_applicator_set_apply_offset (filter->applicator, 0, 0);
|
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))
|
if (gimp_drawable_update_bounding_box (filter->drawable))
|
||||||
g_signal_emit (filter, drawable_filter_signals[FLUSH], 0);
|
g_signal_emit (filter, drawable_filter_signals[FLUSH], 0);
|
||||||
@ -796,7 +831,7 @@ gimp_drawable_filter_sync_crop (GimpDrawableFilter *filter,
|
|||||||
gimp_applicator_set_crop (filter->applicator, enabled ? &new_rect : NULL);
|
gimp_applicator_set_crop (filter->applicator, enabled ? &new_rect : NULL);
|
||||||
|
|
||||||
if (update &&
|
if (update &&
|
||||||
gimp_drawable_filter_is_filtering (filter) &&
|
gimp_drawable_filter_is_active (filter) &&
|
||||||
! gegl_rectangle_equal (&old_rect, &new_rect))
|
! gegl_rectangle_equal (&old_rect, &new_rect))
|
||||||
{
|
{
|
||||||
GeglRectangle diff_rects[4];
|
GeglRectangle diff_rects[4];
|
||||||
@ -1052,21 +1087,29 @@ gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gimp_drawable_filter_is_filtering (GimpDrawableFilter *filter)
|
gimp_drawable_filter_is_added (GimpDrawableFilter *filter)
|
||||||
{
|
{
|
||||||
return gimp_drawable_has_filter (filter->drawable,
|
return gimp_drawable_has_filter (filter->drawable,
|
||||||
GIMP_FILTER (filter));
|
GIMP_FILTER (filter));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gimp_drawable_filter_is_active (GimpDrawableFilter *filter)
|
||||||
|
{
|
||||||
|
return gimp_drawable_filter_is_added (filter) &&
|
||||||
|
filter->preview_enabled;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gimp_drawable_filter_add_filter (GimpDrawableFilter *filter)
|
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));
|
GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable));
|
||||||
|
|
||||||
gimp_viewable_preview_freeze (GIMP_VIEWABLE (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_mask (filter);
|
||||||
gimp_drawable_filter_sync_clip (filter, FALSE);
|
gimp_drawable_filter_sync_clip (filter, FALSE);
|
||||||
gimp_drawable_filter_sync_region (filter);
|
gimp_drawable_filter_sync_region (filter);
|
||||||
@ -1124,7 +1167,7 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter)
|
|||||||
static gboolean
|
static gboolean
|
||||||
gimp_drawable_filter_remove_filter (GimpDrawableFilter *filter)
|
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));
|
GimpImage *image = gimp_item_get_image (GIMP_ITEM (filter->drawable));
|
||||||
|
|
||||||
|
@ -62,6 +62,8 @@ void gimp_drawable_filter_set_region (GimpDrawableFilter *filter,
|
|||||||
void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter,
|
void gimp_drawable_filter_set_crop (GimpDrawableFilter *filter,
|
||||||
const GeglRectangle *rect,
|
const GeglRectangle *rect,
|
||||||
gboolean update);
|
gboolean update);
|
||||||
|
void gimp_drawable_filter_set_preview (GimpDrawableFilter *filter,
|
||||||
|
gboolean enabled);
|
||||||
void gimp_drawable_filter_set_preview_split
|
void gimp_drawable_filter_set_preview_split
|
||||||
(GimpDrawableFilter *filter,
|
(GimpDrawableFilter *filter,
|
||||||
gboolean enabled,
|
gboolean enabled,
|
||||||
|
Reference in New Issue
Block a user