[sushi] font-widget: sync from gnome-font-viewer
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sushi] font-widget: sync from gnome-font-viewer
- Date: Sat, 6 Jul 2019 12:45:05 +0000 (UTC)
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]