summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-08-29 01:26:12 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-08-29 01:26:12 +0000
commit0f2582ff027325841111fe4e908f22a0da91b2e5 (patch)
treeb4d38b6c673ffd3452acf5ceb1a9de146084edbc
parenta217be14f9d30fb97004deb3f1d93bea1ca2e617 (diff)
parentc364f1ee12ffc0ecc6c8d4e43d915f5b1f15d322 (diff)
downloadgtk+-0f2582ff027325841111fe4e908f22a0da91b2e5.tar.gz
Merge branch 'font-feature-work' into 'main'
fontchooser: Improve handling of features See merge request GNOME/gtk!4992
-rw-r--r--gtk/gtkfontchooserwidget.c94
1 files 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)