[gimp] Issue #4793 - Layer-group preview-update blocks UI when adding/removing layers
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Issue #4793 - Layer-group preview-update blocks UI when adding/removing layers
- Date: Fri, 13 Mar 2020 22:48:33 +0000 (UTC)
commit fee159e6b4dc2922d83e9689713d27b9674cd40d
Author: Ell <ell_se yahoo com>
Date: Sat Mar 14 00:37:22 2020 +0200
Issue #4793 - Layer-group preview-update blocks UI when adding/removing layers
In gimp_drawable_get_sub_preview_async(), use
gimp_idle_run_async_full() to render the preview in a low-priority
idle source when the drawable uses a validate handler (i.e., when
it's a group layer), to avoid rendering the preview before the
projection is done rendering, causing a noticeable freeze.
app/core/gimpdrawable-preview.c | 39 ++++++++++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 11 deletions(-)
---
diff --git a/app/core/gimpdrawable-preview.c b/app/core/gimpdrawable-preview.c
index ccdbf253c7..77f808a051 100644
--- a/app/core/gimpdrawable-preview.c
+++ b/app/core/gimpdrawable-preview.c
@@ -36,6 +36,7 @@
#include "gimp.h"
#include "gimp-parallel.h"
+#include "gimp-utils.h"
#include "gimpasync.h"
#include "gimpchannel.h"
#include "gimpimage.h"
@@ -45,6 +46,8 @@
#include "gimplayer.h"
#include "gimptempbuf.h"
+#include "gimp-priorities.h"
+
typedef struct
{
@@ -384,8 +387,7 @@ gimp_drawable_get_sub_preview_async (GimpDrawable *drawable,
(g_getenv ("GIMP_NO_ASYNC_DRAWABLE_PREVIEWS") != NULL);
}
- if (no_async_drawable_previews ||
- gimp_tile_handler_validate_get_assigned (buffer))
+ if (no_async_drawable_previews)
{
GimpAsync *async = gimp_async_new ();
@@ -408,13 +410,28 @@ gimp_drawable_get_sub_preview_async (GimpDrawable *drawable,
scaled_x = RINT ((gdouble) src_x * scale);
scaled_y = RINT ((gdouble) src_y * scale);
- return gimp_parallel_run_async_full (
- +1,
- (GimpRunAsyncFunc) gimp_drawable_get_sub_preview_async_func,
- sub_preview_data_new (
- gimp_drawable_get_preview_format (drawable),
- buffer,
- GEGL_RECTANGLE (scaled_x, scaled_y, dest_width, dest_height),
- scale),
- (GDestroyNotify) sub_preview_data_free);
+ if (gimp_tile_handler_validate_get_assigned (buffer))
+ {
+ return gimp_idle_run_async_full (
+ GIMP_PRIORITY_VIEWABLE_IDLE,
+ (GimpRunAsyncFunc) gimp_drawable_get_sub_preview_async_func,
+ sub_preview_data_new (
+ gimp_drawable_get_preview_format (drawable),
+ buffer,
+ GEGL_RECTANGLE (scaled_x, scaled_y, dest_width, dest_height),
+ scale),
+ (GDestroyNotify) sub_preview_data_free);
+ }
+ else
+ {
+ return gimp_parallel_run_async_full (
+ +1,
+ (GimpRunAsyncFunc) gimp_drawable_get_sub_preview_async_func,
+ sub_preview_data_new (
+ gimp_drawable_get_preview_format (drawable),
+ buffer,
+ GEGL_RECTANGLE (scaled_x, scaled_y, dest_width, dest_height),
+ scale),
+ (GDestroyNotify) sub_preview_data_free);
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]