From fb6c501e44c35494e66d03b89e6961f8edbfe6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Thu, 11 Jul 2019 18:25:26 +0200 Subject: [PATCH 1/5] renderer: Use gtk_icon_theme_load_surface This will allow us to feed in the output scale. --- eek/eek-gtk-renderer.c | 59 +++++++----------------------------------- 1 file changed, 10 insertions(+), 49 deletions(-) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index 749a7f05..77f48551 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -30,66 +30,27 @@ G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER); -static cairo_surface_t * -pixbuf_to_cairo_surface (GdkPixbuf *pixbuf) -{ - cairo_surface_t *dummy_surface; - cairo_pattern_t *pattern; - cairo_surface_t *surface; - cairo_t *cr; - - dummy_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); - - cr = cairo_create (dummy_surface); - gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); - pattern = cairo_get_source (cr); - cairo_pattern_get_surface (pattern, &surface); - cairo_surface_reference (surface); - cairo_destroy (cr); - cairo_surface_destroy (dummy_surface); - - return surface; -} - static cairo_surface_t * eek_gtk_renderer_real_get_icon_surface (EekRenderer *self, const gchar *icon_name, gint size) { - GdkPixbuf *pixbuf; GError *error = NULL; cairo_surface_t *surface; + gint scale = 1; - gchar *path = g_strconcat("/sm/puri/squeekboard/icons/", icon_name, ".svg", NULL); - - pixbuf = gdk_pixbuf_new_from_resource_at_scale (path, size, size, - TRUE, &error); - - if (pixbuf != NULL) - goto found; - else { -/* g_warning ("can't get icon pixbuf for %s: %s", path, error->message);*/ - g_error_free (error); - error = NULL; - } - g_free(path); - - pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), - icon_name, - size, - 0, - &error); - if (pixbuf == NULL) { - g_warning ("can't get icon pixbuf for %s: %s", - icon_name, - error->message); + surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), + icon_name, + size, + scale, + NULL, + 0, + &error); + if (surface == NULL) { + g_warning ("can't get icon surface for %s: %s", g_error_free (error); return NULL; } - -found: - surface = pixbuf_to_cairo_surface (pixbuf); - g_object_unref (pixbuf); return surface; } From 7db33bc92e02018937af95808028cb668e0273ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 15 Jul 2019 13:09:25 +0200 Subject: [PATCH 2/5] renderer: Add icons in resource bundle to the icon theme --- eek/eek-gtk-renderer.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index 77f48551..831fe4fa 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -48,6 +48,8 @@ eek_gtk_renderer_real_get_icon_surface (EekRenderer *self, &error); if (surface == NULL) { g_warning ("can't get icon surface for %s: %s", + icon_name, + error->message); g_error_free (error); return NULL; } @@ -65,6 +67,9 @@ eek_gtk_renderer_class_init (EekGtkRendererClass *klass) static void eek_gtk_renderer_init (EekGtkRenderer *self) { + GtkIconTheme *theme = gtk_icon_theme_get_default (); + + gtk_icon_theme_add_resource_path (theme, "/sm/puri/squeekboard/icons"); } EekRenderer * From cd81aeb286315ea7700ffe0f70da947baced82e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Thu, 11 Jul 2019 18:28:07 +0200 Subject: [PATCH 3/5] get_icon_surface: Add a scale argument This will allow us to pass the output scale around --- eek/eek-gtk-renderer.c | 4 ++-- eek/eek-renderer.c | 8 +++++--- eek/eek-renderer.h | 6 ++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/eek/eek-gtk-renderer.c b/eek/eek-gtk-renderer.c index 831fe4fa..b16966e9 100644 --- a/eek/eek-gtk-renderer.c +++ b/eek/eek-gtk-renderer.c @@ -33,11 +33,11 @@ G_DEFINE_TYPE (EekGtkRenderer, eek_gtk_renderer, EEK_TYPE_RENDERER); static cairo_surface_t * eek_gtk_renderer_real_get_icon_surface (EekRenderer *self, const gchar *icon_name, - gint size) + gint size, + gint scale) { GError *error = NULL; cairo_surface_t *surface; - gint scale = 1; surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), icon_name, diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index f0dd0097..bb28aaa5 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -503,7 +503,8 @@ render_key (EekRenderer *self, cairo_surface_t *icon_surface = eek_renderer_get_icon_surface (self, eek_symbol_get_icon_name (symbol), - MIN(bounds.width, bounds.height)); + MIN(bounds.width, bounds.height), + 1); if (icon_surface) { gint width = cairo_image_surface_get_width (icon_surface); gint height = cairo_image_surface_get_height (icon_surface); @@ -1071,7 +1072,8 @@ eek_renderer_render_key_outline (EekRenderer *renderer, cairo_surface_t * eek_renderer_get_icon_surface (EekRenderer *renderer, const gchar *icon_name, - gint size) + gint size, + gint scale) { EekRendererClass *klass; @@ -1079,7 +1081,7 @@ eek_renderer_get_icon_surface (EekRenderer *renderer, klass = EEK_RENDERER_GET_CLASS(renderer); if (klass->get_icon_surface) - return klass->get_icon_surface (renderer, icon_name, size); + return klass->get_icon_surface (renderer, icon_name, size, scale); return NULL; } diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index 0b97b38c..ecd67974 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -58,7 +58,8 @@ struct _EekRendererClass cairo_surface_t *(* get_icon_surface) (EekRenderer *self, const gchar *icon_name, - gint size); + gint size, + gint scale); /*< private >*/ /* padding */ @@ -103,7 +104,8 @@ void eek_renderer_render_key (EekRenderer *renderer, cairo_surface_t *eek_renderer_get_icon_surface (EekRenderer *renderer, const gchar *icon_name, - gint size); + gint size, + gint scale); void eek_renderer_render_keyboard (EekRenderer *renderer, cairo_t *cr); From d0fa444a0ef9da197118032480f101f16b9daa7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sat, 13 Jul 2019 16:18:23 +0200 Subject: [PATCH 4/5] Honor the outputs scale factor --- eek/eek-gtk-keyboard.c | 2 ++ eek/eek-renderer.c | 19 +++++++++++++++---- eek/eek-renderer.h | 2 ++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index 436e754e..3a2dfb5c 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -124,6 +124,8 @@ eek_gtk_keyboard_real_draw (GtkWidget *self, eek_renderer_set_allocation_size (priv->renderer, allocation.width, allocation.height); + eek_renderer_set_scale_factor (priv->renderer, + gtk_widget_get_scale_factor (self)); } eek_renderer_render_keyboard (priv->renderer, cr); diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index bb28aaa5..e1f6f76d 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -48,6 +48,7 @@ typedef struct _EekRendererPrivate gdouble allocation_width; gdouble allocation_height; gdouble scale; + gint scale_factor; /* the outputs scale factor */ PangoFontDescription *ascii_font; PangoFontDescription *font; @@ -499,20 +500,20 @@ render_key (EekRenderer *self, #define SCALE 0.4 if (eek_symbol_get_icon_name (symbol)) { - + gint scale = priv->scale_factor; cairo_surface_t *icon_surface = eek_renderer_get_icon_surface (self, eek_symbol_get_icon_name (symbol), MIN(bounds.width, bounds.height), - 1); + scale); if (icon_surface) { gint width = cairo_image_surface_get_width (icon_surface); gint height = cairo_image_surface_get_height (icon_surface); cairo_save (cr); cairo_translate (cr, - (bounds.width - width * SCALE) / 2, - (bounds.height - height * SCALE) / 2); + (bounds.width - width * SCALE / scale) / 2, + (bounds.height - height * SCALE / scale) / 2); cairo_rectangle (cr, 0, 0, width, height); cairo_scale (cr, SCALE, SCALE); cairo_clip (cr); @@ -845,6 +846,7 @@ eek_renderer_init (EekRenderer *self) priv->allocation_width = 0.0; priv->allocation_height = 0.0; priv->scale = 1.0; + priv->scale_factor = 1; priv->font = NULL; priv->outline_surface_cache = g_hash_table_new_full (g_direct_hash, @@ -1029,6 +1031,15 @@ eek_renderer_get_scale (EekRenderer *renderer) return priv->scale; } +void +eek_renderer_set_scale_factor (EekRenderer *renderer, gint scale) +{ + g_return_if_fail (EEK_IS_RENDERER(renderer)); + + EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer); + priv->scale_factor = scale; +} + PangoLayout * eek_renderer_create_pango_layout (EekRenderer *renderer) { diff --git a/eek/eek-renderer.h b/eek/eek-renderer.h index ecd67974..d301356b 100644 --- a/eek/eek-renderer.h +++ b/eek/eek-renderer.h @@ -82,6 +82,8 @@ void eek_renderer_get_key_bounds (EekRenderer *renderer, gboolean rotate); gdouble eek_renderer_get_scale (EekRenderer *renderer); +void eek_renderer_set_scale_factor (EekRenderer *renderer, + gint scale); PangoLayout *eek_renderer_create_pango_layout (EekRenderer *renderer); From 086f6bd7728b4266bf385135021cbb24d3292256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 15 Jul 2019 13:23:16 +0200 Subject: [PATCH 5/5] renderer: Only scale by output scale The original eekboard code scaled icons by a factor. That was simplified in c529e9ed9c2f6f4a430b257430d84ef3e9f36fdc but we can do away with it completely and fetch the icons at the right size making them not blurry. --- eek/eek-renderer.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index e1f6f76d..1d7585b8 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -504,7 +504,7 @@ render_key (EekRenderer *self, cairo_surface_t *icon_surface = eek_renderer_get_icon_surface (self, eek_symbol_get_icon_name (symbol), - MIN(bounds.width, bounds.height), + SCALE * MIN(bounds.width, bounds.height), scale); if (icon_surface) { gint width = cairo_image_surface_get_width (icon_surface); @@ -512,10 +512,9 @@ render_key (EekRenderer *self, cairo_save (cr); cairo_translate (cr, - (bounds.width - width * SCALE / scale) / 2, - (bounds.height - height * SCALE / scale) / 2); + (bounds.width - width / scale) / 2, + (bounds.height - height / scale) / 2); cairo_rectangle (cr, 0, 0, width, height); - cairo_scale (cr, SCALE, SCALE); cairo_clip (cr); /* Draw the shape of the icon using the foreground color */ cairo_set_source_rgba (cr, foreground.red,