Patch added for performance problem in clutter text rendering

More details here:

    https://gitlab.gnome.org/GNOME/mutter/merge_requests/20
This commit is contained in:
Bruce Leidl 2018-03-25 08:28:14 -04:00
parent 8aa341191e
commit 55c9fe5b90
2 changed files with 113 additions and 1 deletions

View File

@ -0,0 +1,108 @@
From 8286557a0555058440536e88393fda445d49d399 Mon Sep 17 00:00:00 2001
From: Yussuf Khalil <dev@pp3345.net>
Date: Sun, 18 Feb 2018 21:21:44 +0100
Subject: [PATCH] clutter: Avoid unnecessary relayouts in ClutterText
We can save an unnecessary relayout if the required size to fully draw the text
is equal to the currently allocated size after the underlying text buffer or
attributes that only affect the PangoLayout have changed.
---
clutter/clutter/clutter-text.c | 43 ++++++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 16 deletions(-)
diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c
index 4828a4cbd..4a6a74a0c 100644
--- a/clutter/clutter/clutter-text.c
+++ b/clutter/clutter/clutter-text.c
@@ -4511,6 +4511,27 @@ buffer_deleted_text (ClutterTextBuffer *buffer,
}
}
+static void
+clutter_text_queue_redraw_or_relayout (ClutterText *self)
+{
+ ClutterActor *actor = CLUTTER_ACTOR (self);
+ gfloat preferred_width;
+ gfloat preferred_height;
+
+ clutter_text_dirty_cache (self);
+
+ /* we're using our private implementations here to avoid the caching done by ClutterActor */
+ clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width);
+ clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height);
+
+ if (clutter_actor_has_allocation (actor) &&
+ (fabsf (preferred_width - clutter_actor_get_width (actor)) > 0.001 ||
+ fabsf (preferred_height - clutter_actor_get_height (actor)) > 0.001))
+ clutter_actor_queue_relayout (actor);
+ else
+ clutter_text_queue_redraw (actor);
+}
+
static void
buffer_notify_text (ClutterTextBuffer *buffer,
GParamSpec *spec,
@@ -4518,9 +4539,7 @@ buffer_notify_text (ClutterTextBuffer *buffer,
{
g_object_freeze_notify (G_OBJECT (self));
- clutter_text_dirty_cache (self);
-
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]);
@@ -4872,8 +4891,7 @@ clutter_text_set_cursor_visible (ClutterText *self,
{
priv->cursor_visible = cursor_visible;
- clutter_text_dirty_cache (self);
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]);
}
@@ -5774,9 +5792,7 @@ clutter_text_set_line_alignment (ClutterText *self,
{
priv->alignment = alignment;
- clutter_text_dirty_cache (self);
-
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_LINE_ALIGNMENT]);
}
@@ -5831,9 +5847,7 @@ clutter_text_set_use_markup (ClutterText *self,
if (setting)
clutter_text_set_markup_internal (self, text);
- clutter_text_dirty_cache (self);
-
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
}
/**
@@ -5880,9 +5894,7 @@ clutter_text_set_justify (ClutterText *self,
{
priv->justify = justify;
- clutter_text_dirty_cache (self);
-
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_JUSTIFY]);
}
@@ -6449,8 +6461,7 @@ clutter_text_set_preedit_string (ClutterText *self,
priv->preedit_set = TRUE;
}
- clutter_text_dirty_cache (self);
- clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
+ clutter_text_queue_redraw_or_relayout (self);
}

View File

@ -3,7 +3,11 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI[archive.md5sum] = "7a3baf2fbb02f9cc341bf0424a31d0d2"
SRC_URI[archive.sha256sum] = "58fffc8025f21fb6da27bd2189b6db4d20c54f950b1a46aa7f7cbf0a82d386b0"
SRC_URI_append = " file://0001-remove-check-for-zenity.patch file://startup-notification.patch"
SRC_URI_append = "\
file://0001-remove-check-for-zenity.patch \
file://0002-avoid-unnecessary-relayouts-in-cluttertext.patch \
file://startup-notification.patch \
"
DEPENDS = "libxrandr libsm libx11 libxi glib-2.0 wayland-protocols libwacom mesa gtk+3 pango cairo gsettings-desktop-schemas xcomposite upower gnome-desktop libxkbfile json-glib wayland-native xinerama zenity libinput libcanberra"
RDEPENDS_${PN} = "zenity"