[gtk/font-feature-work] fontchooser: Improve handling of features




commit c364f1ee12ffc0ecc6c8d4e43d915f5b1f15d322
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Aug 28 17:02:56 2022 -0400

    fontchooser: Improve handling of features
    
    salt and swsh need to be treated like cvXX, with
    a dropdown. Also add examples to the default cases
    of radio groups.

 gtk/gtkfontchooserwidget.c | 94 ++++++++++++++++++++++++++--------------------
 1 file changed, 53 insertions(+), 41 deletions(-)
---
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 4a600878a9..625ac6bf18 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -2002,11 +2002,13 @@ update_feature_label (GtkFontChooserWidget *fontchooser,
   unsigned int script_index, lang_index, feature_index;
   hb_ot_name_id_t label_id, first_param_id;
   unsigned int num_params;
+  const char *feat[] = { "salt", "swsh", "nalt", NULL };
 
   hb_face = hb_font_get_face (hb_font);
 
-  if (!(g_str_has_prefix (item->name, "ss") || g_str_has_prefix (item->name, "cv")) ||
-      !g_ascii_isdigit (item->name[2]) || !g_ascii_isdigit (item->name[3]))
+  if (!g_strv_contains (feat, item->name) &&
+      (!(g_str_has_prefix (item->name, "ss") || g_str_has_prefix (item->name, "cv")) ||
+       !g_ascii_isdigit (item->name[2]) || !g_ascii_isdigit (item->name[3])))
     return;
 
   hb_ot_layout_table_find_script (hb_face, HB_OT_TAG_GSUB, script_tag, &script_index);
@@ -2015,32 +2017,31 @@ update_feature_label (GtkFontChooserWidget *fontchooser,
   hb_ot_layout_script_find_language (hb_face, HB_OT_TAG_GSUB, script_index, lang_tag, &lang_index);
   G_GNUC_END_IGNORE_DEPRECATIONS
 
-  if (hb_ot_layout_language_find_feature (hb_face, HB_OT_TAG_GSUB, script_index, lang_index, item->tag, 
&feature_index) &&
-      hb_ot_layout_feature_get_name_ids (hb_face, HB_OT_TAG_GSUB, feature_index, &label_id, NULL, NULL, 
&num_params, &first_param_id))
+  if (hb_ot_layout_language_find_feature (hb_face, HB_OT_TAG_GSUB, script_index, lang_index, item->tag, 
&feature_index))
     {
-      if (label_id != HB_OT_NAME_ID_INVALID)
+      char *label;
+
+      if (!hb_ot_layout_feature_get_name_ids (hb_face, HB_OT_TAG_GSUB, feature_index, &label_id, NULL, NULL, 
&num_params, &first_param_id))
         {
-          char *label = get_name (hb_face, label_id);
-          if (GTK_IS_CHECK_BUTTON (item->feat))
-            gtk_check_button_set_label (GTK_CHECK_BUTTON (item->feat), label);
-          else
-            {
-              GtkWidget *l = gtk_widget_get_prev_sibling (item->feat);
-              gtk_label_set_label (GTK_LABEL (l), label);
-            }
-          g_free (label);
+          label_id = HB_OT_NAME_ID_INVALID;
+          num_params = 0;
         }
+
+      if (label_id != HB_OT_NAME_ID_INVALID)
+        label = get_name (hb_face, label_id);
+      else
+        label = get_feature_display_name (item->tag);
+
+      if (GTK_IS_CHECK_BUTTON (item->feat))
+        gtk_check_button_set_label (GTK_CHECK_BUTTON (item->feat), label);
       else
         {
-          if (GTK_IS_CHECK_BUTTON (item->feat))
-            gtk_check_button_set_label (GTK_CHECK_BUTTON (item->feat), item->name);
-          else
-            {
-              GtkWidget *l = gtk_widget_get_prev_sibling (item->feat);
-              gtk_label_set_label (GTK_LABEL (l), item->name);
-            }
+          GtkWidget *l = gtk_widget_get_prev_sibling (item->feat);
+          gtk_label_set_label (GTK_LABEL (l), label);
         }
 
+      g_free (label);
+
       if (GTK_IS_DROP_DOWN (item->feat))
         {
           unsigned int n_lookups;
@@ -2130,9 +2131,9 @@ update_feature_example (GtkFontChooserWidget *fontchooser,
                         PangoFontDescription *font_desc)
 {
   const char *letter_case[] = { "smcp", "c2sc", "pcap", "c2pc", "unic", "cpsp", "case", NULL };
-  const char *number_case[] = { "xxxx", "lnum", "onum", NULL };
-  const char *number_spacing[] = { "xxxx", "pnum", "tnum", NULL };
-  const char *fraction[] = { "xxxx", "frac", "afrc", NULL };
+  const char *number_case[] = { "xxnc", "lnum", "onum", NULL };
+  const char *number_spacing[] = { "xxns", "pnum", "tnum", NULL };
+  const char *fraction[] = { "xxnf", "frac", "afrc", NULL };
   const char *char_variants[] = {
     "zero", "nalt",
     "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand",
@@ -2189,8 +2190,6 @@ update_feature_example (GtkFontChooserWidget *fontchooser,
         input = g_strdup ("AaBbCc…");
       else if (strcmp (item->name, "zero") == 0)
         input = g_strdup ("0");
-      else if (strcmp (item->name, "nalt") == 0)
-        input = find_affected_text (fontchooser, item->tag, hb_font, script_tag, lang_tag, 3);
       else
         input = find_affected_text (fontchooser, item->tag, hb_font, script_tag, lang_tag, 10);
 
@@ -2346,15 +2345,18 @@ add_enum_group (GtkFontChooserWidget  *fontchooser,
   gtk_grid_set_row_spacing (GTK_GRID (group), 6);
   gtk_grid_set_column_spacing (GTK_GRID (group), 12);
 
-  label = gtk_label_new (title);
-  gtk_label_set_xalign (GTK_LABEL (label), 0.0);
-  gtk_widget_set_halign (label, GTK_ALIGN_START);
-  g_object_set (label, "margin-top", 10, "margin-bottom", 10, NULL);
-  attrs = pango_attr_list_new ();
-  pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
-  gtk_label_set_attributes (GTK_LABEL (label), attrs);
-  pango_attr_list_unref (attrs);
-  gtk_grid_attach (GTK_GRID (group), label, 0, -1, 3, 1);
+  if (title)
+    {
+      label = gtk_label_new (title);
+      gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+      gtk_widget_set_halign (label, GTK_ALIGN_START);
+      g_object_set (label, "margin-top", 10, "margin-bottom", 10, NULL);
+      attrs = pango_attr_list_new ();
+      pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
+      gtk_label_set_attributes (GTK_LABEL (label), attrs);
+      pango_attr_list_unref (attrs);
+      gtk_grid_attach (GTK_GRID (group), label, 0, -1, 3, 1);
+    }
 
   for (i = 0; i < n_tags; i++)
     {
@@ -2472,15 +2474,17 @@ gtk_font_chooser_widget_populate_features (GtkFontChooserWidget *fontchooser)
 {
   const char *ligatures[] = { "liga", "dlig", "hlig", "clig" };
   const char *letter_case[] = { "smcp", "c2sc", "pcap", "c2pc", "unic", "cpsp", "case" };
-  const char *number_case[] = { "xxxx", "lnum", "onum" };
-  const char *number_spacing[] = { "xxxx", "pnum", "tnum" };
-  const char *fractions[] = { "xxxx", "frac", "afrc" };
+  const char *number_case[] = { "xxnc", "lnum", "onum" };
+  const char *number_spacing[] = { "xxns", "pnum", "tnum" };
+  const char *fractions[] = { "xxnf", "frac", "afrc" };
   const char *style_variants[] = {
-    "zero", "nalt",
-    "swsh", "cswh", "calt", "falt", "hist", "salt", "jalt", "titl", "rand",
+    "zero", "cswh", "calt", "falt", "hist", "jalt", "titl", "rand",
     "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10",
     "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20",
   };
+  const char *style_variants2[] = {
+    "swsh", "salt", "nalt"
+  };
   const char *char_variants[] = {
     "cv01", "cv02", "cv03", "cv04", "cv05", "cv06", "cv07", "cv08", "cv09", "cv10",
     "cv11", "cv12", "cv13", "cv14", "cv15", "cv16", "cv17", "cv18", "cv19", "cv20",
@@ -2500,6 +2504,7 @@ gtk_font_chooser_widget_populate_features (GtkFontChooserWidget *fontchooser)
   add_radio_group (fontchooser, _("Number Spacing"), number_spacing, G_N_ELEMENTS (number_spacing));
   add_radio_group (fontchooser, _("Fractions"), fractions, G_N_ELEMENTS (fractions));
   add_check_group (fontchooser, _("Style Variations"), style_variants, G_N_ELEMENTS (style_variants));
+  add_enum_group (fontchooser, NULL, style_variants2, G_N_ELEMENTS (style_variants2));
   add_enum_group (fontchooser, _("Character Variations"), char_variants, G_N_ELEMENTS (char_variants));
 
   update_font_features (fontchooser);
@@ -2581,6 +2586,13 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser)
           for (l = fontchooser->feature_items; l; l = l->next)
             {
               FeatureItem *item = l->data;
+
+              if (strncmp (item->name, "xx", 2) == 0)
+                {
+                  update_feature_example (fontchooser, item, hb_font, script_tag, lang_tag, 
fontchooser->font_desc);
+                  continue;
+                }
+
               if (item->tag != features[j])
                 continue;
 
@@ -2647,7 +2659,7 @@ update_font_features (GtkFontChooserWidget *fontchooser)
       if (GTK_IS_CHECK_BUTTON (item->feat) && g_object_get_data (G_OBJECT (item->feat), "default"))
         {
           if (gtk_check_button_get_active (GTK_CHECK_BUTTON (item->feat)) &&
-              strcmp (item->name, "xxxx") != 0)
+              strncmp (item->name, "xx", 2) != 0)
             {
               hb_feature_to_string (&(hb_feature_t) { item->tag, 1, 0, -1 }, buf, sizeof (buf));
               if (s->len > 0)


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