[sushi] font-widget: sync from gnome-font-viewer



commit 2b1617bfcfa37a65b148b52ab902362cb1fa5b36
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Jul 6 05:44:43 2019 -0700

    font-widget: sync from gnome-font-viewer

 src/libsushi/sushi-font-widget.c | 90 ++++++++++++++++++++++++----------------
 1 file changed, 55 insertions(+), 35 deletions(-)
---
diff --git a/src/libsushi/sushi-font-widget.c b/src/libsushi/sushi-font-widget.c
index e0ba634..43b5a0c 100644
--- a/src/libsushi/sushi-font-widget.c
+++ b/src/libsushi/sushi-font-widget.c
@@ -241,9 +241,6 @@ check_font_contain_text (FT_Face face,
   gboolean retval = TRUE;
 
   string = g_utf8_to_ucs4_fast (text, -1, &len);
-
-  FT_Select_Charmap (face, FT_ENCODING_UNICODE);
-
   for (idx = 0; idx < len; idx++) {
     gunichar c = string[idx];
 
@@ -298,6 +295,9 @@ random_string_from_available_chars (FT_Face face,
   if (total_chars == 0)
     return NULL;
 
+  if (total_chars <= n_chars)
+    return chars;
+
   retval = g_string_new (NULL);
 
   while (idx < n_chars) {
@@ -329,17 +329,40 @@ set_pango_sample_string (SushiFontWidget *self)
       retval = TRUE;
   }
 
-  if (retval) {
-    g_free (self->sample_string);
+  g_clear_pointer (&self->sample_string, g_free);
+
+  if (retval)
     self->sample_string = g_strdup (sample_string);
-  }
 
   return retval;
 }
 
+static void
+select_best_charmap (SushiFontWidget *self)
+{
+  gchar *chars;
+  gint idx, n_chars;
+
+  if (FT_Select_Charmap (self->face, FT_ENCODING_UNICODE) == 0)
+    return;
+
+  for (idx = 0; idx < self->face->num_charmaps; idx++) {
+    if (FT_Set_Charmap (self->face, self->face->charmaps[idx]) != 0)
+      continue;
+
+    chars = build_charlist_for_face (self->face, &n_chars);
+    g_free (chars);
+
+    if (n_chars > 0)
+      break;
+  }
+}
+
 static void
 build_strings_for_face (SushiFontWidget *self)
 {
+  select_best_charmap (self);
+
   /* if we don't have lowercase/uppercase/punctuation text in the face,
    * we omit it directly, and render a random text below.
    */
@@ -362,18 +385,8 @@ build_strings_for_face (SushiFontWidget *self)
     self->sample_string = random_string_from_available_chars (self->face, 36);
 
   g_free (self->font_name);
-  self->font_name = NULL;
-
-  if (self->face->family_name != NULL) {
-    gchar *font_name = 
-      g_strconcat (self->face->family_name, " ",
-                   self->face->style_name, NULL);
-
-    if (check_font_contain_text (self->face, font_name))
-      self->font_name = font_name;
-    else
-      g_free (font_name);
-  }
+  self->font_name = g_strconcat (self->face->family_name, " ",
+                                 self->face->style_name, NULL);
 }
 
 static gint *
@@ -479,19 +492,22 @@ sushi_font_widget_size_request (GtkWidget *drawing_area,
   pixmap_height = padding.top + padding.bottom;
 
   font = cairo_ft_font_face_create_for_ft_face (face, 0);
-  cairo_set_font_face (cr, font);
-  cairo_font_face_destroy (font);
 
-  if (self->font_name != NULL) {
-      cairo_set_font_size (cr, title_size);
-      cairo_font_extents (cr, &font_extents);
-      text_extents (cr, self->font_name, &extents);
-      pixmap_height += font_extents.ascent + font_extents.descent +
-        extents.y_advance + LINE_SPACING;
-      pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right);
-  }
+  if (check_font_contain_text (face, self->font_name))
+    cairo_set_font_face (cr, font);
+  else
+    cairo_set_font_face (cr, NULL);
+
+  cairo_set_font_size (cr, title_size);
+  cairo_font_extents (cr, &font_extents);
+  text_extents (cr, self->font_name, &extents);
+  pixmap_height += font_extents.ascent + font_extents.descent +
+    extents.y_advance + LINE_SPACING;
+  pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right);
 
   pixmap_height += SECTION_SPACING / 2;
+
+  cairo_set_font_face (cr, font);
   cairo_set_font_size (cr, alpha_size);
   cairo_font_extents (cr, &font_extents);
 
@@ -544,6 +560,7 @@ sushi_font_widget_size_request (GtkWidget *drawing_area,
     *height = pixmap_height;
 
   cairo_destroy (cr);
+  cairo_font_face_destroy (font);
   cairo_surface_destroy (surface);
   g_free (sizes);
 }
@@ -580,7 +597,7 @@ sushi_font_widget_draw (GtkWidget *drawing_area,
 {
   SushiFontWidget *self = SUSHI_FONT_WIDGET (drawing_area);
   gint *sizes = NULL, n_sizes, alpha_size, title_size, pos_y = 0, i;
-  cairo_font_face_t *font;
+  cairo_font_face_t *font = NULL;
   FT_Face face = self->face;
   GtkStyleContext *context;
   GdkRGBA color;
@@ -608,20 +625,21 @@ sushi_font_widget_draw (GtkWidget *drawing_area,
   sizes = build_sizes_table (face, &n_sizes, &alpha_size, &title_size);
 
   font = cairo_ft_font_face_create_for_ft_face (face, 0);
-  cairo_set_font_face (cr, font);
-  cairo_font_face_destroy (font);
 
   /* draw text */
+  if (check_font_contain_text (face, self->font_name))
+    cairo_set_font_face (cr, font);
+  else
+    cairo_set_font_face (cr, NULL);
 
-  if (self->font_name != NULL) {
-    cairo_set_font_size (cr, title_size);
-    draw_string (self, cr, padding, self->font_name, &pos_y);
-  }
+  cairo_set_font_size (cr, title_size);
+  draw_string (self, cr, padding, self->font_name, &pos_y);
 
   if (pos_y > allocated_height)
     goto end;
 
   pos_y += SECTION_SPACING / 2;
+  cairo_set_font_face (cr, font);
   cairo_set_font_size (cr, alpha_size);
 
   if (self->lowercase_text != NULL)
@@ -650,6 +668,8 @@ sushi_font_widget_draw (GtkWidget *drawing_area,
   }
 
  end:
+  if (font != NULL)
+    cairo_font_face_destroy (font);
   g_free (sizes);
 
   return FALSE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]