css: always get default font size in pixels

Fixes a couple bugs...

 - Pixel font sizes in css would render as point sizes.

 - For em font sizes, where the parent size was set and not default, we would
   incorrectly convert a pixel value from points to pixels.

We'll always grab the default font size in pixels so we don't keep confusing
things.

Worth noting that gtk css font-size will still behave differently than the
web. Pango interprets font-size differently.
This commit is contained in:
Matt Watson 2016-04-11 18:18:31 -07:00
parent f9ba55eaad
commit df08fc91bd
4 changed files with 44 additions and 29 deletions

View File

@ -37,7 +37,7 @@ gtk_css_value_dimension_free (GtkCssValue *value)
} }
static double static double
get_base_font_size (guint property_id, get_base_font_size_px (guint property_id,
GtkStyleProviderPrivate *provider, GtkStyleProviderPrivate *provider,
GtkCssStyle *style, GtkCssStyle *style,
GtkCssStyle *parent_style) GtkCssStyle *parent_style)
@ -47,7 +47,7 @@ get_base_font_size (guint property_id,
if (parent_style) if (parent_style)
return _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100); return _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
else else
return _gtk_css_font_size_get_default (provider); return gtk_css_font_size_get_default_px (provider, style);
} }
return _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_FONT_SIZE), 100); return _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
@ -109,7 +109,7 @@ gtk_css_value_dimension_compute (GtkCssValue *number,
/* percentages for font sizes are computed, other percentages aren't */ /* percentages for font sizes are computed, other percentages aren't */
if (property_id == GTK_CSS_PROPERTY_FONT_SIZE) if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
return gtk_css_dimension_value_new (number->value / 100.0 * return gtk_css_dimension_value_new (number->value / 100.0 *
get_base_font_size (property_id, provider, style, parent_style), get_base_font_size_px (property_id, provider, style, parent_style),
GTK_CSS_PX); GTK_CSS_PX);
case GTK_CSS_NUMBER: case GTK_CSS_NUMBER:
case GTK_CSS_PX: case GTK_CSS_PX:
@ -132,17 +132,17 @@ gtk_css_value_dimension_compute (GtkCssValue *number,
return gtk_css_dimension_value_new (number->value * get_dpi (style) * 0.039370078740157477, return gtk_css_dimension_value_new (number->value * get_dpi (style) * 0.039370078740157477,
GTK_CSS_PX); GTK_CSS_PX);
case GTK_CSS_EM: case GTK_CSS_EM:
return gtk_css_dimension_value_new (number->value * get_dpi (style) / 72.0 * return gtk_css_dimension_value_new (number->value *
get_base_font_size (property_id, provider, style, parent_style), get_base_font_size_px (property_id, provider, style, parent_style),
GTK_CSS_PX); GTK_CSS_PX);
case GTK_CSS_EX: case GTK_CSS_EX:
/* for now we pretend ex is half of em */ /* for now we pretend ex is half of em */
return gtk_css_dimension_value_new (number->value * 0.5 * get_dpi (style) / 72.0 * return gtk_css_dimension_value_new (number->value * 0.5 *
get_base_font_size (property_id, provider, style, parent_style), get_base_font_size_px (property_id, provider, style, parent_style),
GTK_CSS_PX); GTK_CSS_PX);
case GTK_CSS_REM: case GTK_CSS_REM:
return gtk_css_dimension_value_new (number->value * get_dpi (style) / 72.0 * return gtk_css_dimension_value_new (number->value *
_gtk_css_font_size_get_default (provider), gtk_css_font_size_get_default_px (provider, style),
GTK_CSS_PX); GTK_CSS_PX);
case GTK_CSS_RAD: case GTK_CSS_RAD:
return gtk_css_dimension_value_new (number->value * 360.0 / (2 * G_PI), return gtk_css_dimension_value_new (number->value * 360.0 / (2 * G_PI),

View File

@ -127,13 +127,20 @@ _gtk_css_border_style_value_get (const GtkCssValue *value)
/* GtkCssFontSize */ /* GtkCssFontSize */
static double
get_dpi (GtkCssStyle *style)
{
return _gtk_css_number_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_DPI), 96);
}
/* XXX: Kinda bad to have that machinery here, nobody expects vital font /* XXX: Kinda bad to have that machinery here, nobody expects vital font
* size code to appear in gtkcssvalueenum.c. * size code to appear in gtkcssvalueenum.c.
*/ */
#define DEFAULT_FONT_SIZE 10 #define DEFAULT_FONT_SIZE_PT 10
double double
_gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider) gtk_css_font_size_get_default_px (GtkStyleProviderPrivate *provider,
GtkCssStyle *style)
{ {
GtkSettings *settings; GtkSettings *settings;
PangoFontDescription *description; PangoFontDescription *description;
@ -142,18 +149,22 @@ _gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider)
settings = _gtk_style_provider_private_get_settings (provider); settings = _gtk_style_provider_private_get_settings (provider);
if (settings == NULL) if (settings == NULL)
return DEFAULT_FONT_SIZE; return DEFAULT_FONT_SIZE_PT * get_dpi (style) / 72.0;
g_object_get (settings, "gtk-font-name", &font_name, NULL); g_object_get (settings, "gtk-font-name", &font_name, NULL);
description = pango_font_description_from_string (font_name); description = pango_font_description_from_string (font_name);
g_free (font_name); g_free (font_name);
if (description == NULL) if (description == NULL)
return DEFAULT_FONT_SIZE; return DEFAULT_FONT_SIZE_PT * get_dpi (style) / 72.0;
if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_SIZE) if (pango_font_description_get_set_fields (description) & PANGO_FONT_MASK_SIZE)
{
font_size = (double) pango_font_description_get_size (description) / PANGO_SCALE; font_size = (double) pango_font_description_get_size (description) / PANGO_SCALE;
if (!pango_font_description_get_size_is_absolute (description))
font_size = font_size * get_dpi (style) / 72.0;
}
else else
font_size = DEFAULT_FONT_SIZE; font_size = DEFAULT_FONT_SIZE_PT * get_dpi (style) / 72.0;
pango_font_description_free (description); pango_font_description_free (description);
return font_size; return font_size;
@ -171,34 +182,34 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
switch (value->value) switch (value->value)
{ {
case GTK_CSS_FONT_SIZE_XX_SMALL: case GTK_CSS_FONT_SIZE_XX_SMALL:
font_size = _gtk_css_font_size_get_default (provider) * 3. / 5; font_size = gtk_css_font_size_get_default_px (provider, style) * 3. / 5;
break; break;
case GTK_CSS_FONT_SIZE_X_SMALL: case GTK_CSS_FONT_SIZE_X_SMALL:
font_size = _gtk_css_font_size_get_default (provider) * 3. / 4; font_size = gtk_css_font_size_get_default_px (provider, style) * 3. / 4;
break; break;
case GTK_CSS_FONT_SIZE_SMALL: case GTK_CSS_FONT_SIZE_SMALL:
font_size = _gtk_css_font_size_get_default (provider) * 8. / 9; font_size = gtk_css_font_size_get_default_px (provider, style) * 8. / 9;
break; break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
/* fall thru */ /* fall thru */
case GTK_CSS_FONT_SIZE_MEDIUM: case GTK_CSS_FONT_SIZE_MEDIUM:
font_size = _gtk_css_font_size_get_default (provider); font_size = gtk_css_font_size_get_default_px (provider, style);
break; break;
case GTK_CSS_FONT_SIZE_LARGE: case GTK_CSS_FONT_SIZE_LARGE:
font_size = _gtk_css_font_size_get_default (provider) * 6. / 5; font_size = gtk_css_font_size_get_default_px (provider, style) * 6. / 5;
break; break;
case GTK_CSS_FONT_SIZE_X_LARGE: case GTK_CSS_FONT_SIZE_X_LARGE:
font_size = _gtk_css_font_size_get_default (provider) * 3. / 2; font_size = gtk_css_font_size_get_default_px (provider, style) * 3. / 2;
break; break;
case GTK_CSS_FONT_SIZE_XX_LARGE: case GTK_CSS_FONT_SIZE_XX_LARGE:
font_size = _gtk_css_font_size_get_default (provider) * 2; font_size = gtk_css_font_size_get_default_px (provider, style) * 2;
break; break;
case GTK_CSS_FONT_SIZE_SMALLER: case GTK_CSS_FONT_SIZE_SMALLER:
if (parent_style) if (parent_style)
font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100); font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
else else
font_size = _gtk_css_font_size_get_default (provider); font_size = gtk_css_font_size_get_default_px (provider, style);
/* XXX: This is what WebKit does... */ /* XXX: This is what WebKit does... */
font_size /= 1.2; font_size /= 1.2;
break; break;
@ -206,7 +217,7 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
if (parent_style) if (parent_style)
font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100); font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
else else
font_size = _gtk_css_font_size_get_default (provider); font_size = gtk_css_font_size_get_default_px (provider, style);
/* XXX: This is what WebKit does... */ /* XXX: This is what WebKit does... */
font_size *= 1.2; font_size *= 1.2;
break; break;

View File

@ -34,7 +34,8 @@ GtkBorderStyle _gtk_css_border_style_value_get (const GtkCssValue *value)
GtkCssValue * _gtk_css_font_size_value_new (GtkCssFontSize size); GtkCssValue * _gtk_css_font_size_value_new (GtkCssFontSize size);
GtkCssValue * _gtk_css_font_size_value_try_parse (GtkCssParser *parser); GtkCssValue * _gtk_css_font_size_value_try_parse (GtkCssParser *parser);
GtkCssFontSize _gtk_css_font_size_value_get (const GtkCssValue *value); GtkCssFontSize _gtk_css_font_size_value_get (const GtkCssValue *value);
double _gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider); double gtk_css_font_size_get_default_px (GtkStyleProviderPrivate *provider,
GtkCssStyle *style);
GtkCssValue * _gtk_css_font_style_value_new (PangoStyle style); GtkCssValue * _gtk_css_font_style_value_new (PangoStyle style);
GtkCssValue * _gtk_css_font_style_value_try_parse (GtkCssParser *parser); GtkCssValue * _gtk_css_font_style_value_try_parse (GtkCssParser *parser);

View File

@ -1074,6 +1074,7 @@ pack_font_description (GtkCssShorthandProperty *shorthand,
{ {
PangoFontDescription *description; PangoFontDescription *description;
GtkCssValue *v; GtkCssValue *v;
double dpi;
description = pango_font_description_new (); description = pango_font_description_new ();
@ -1084,9 +1085,11 @@ pack_font_description (GtkCssShorthandProperty *shorthand,
pango_font_description_set_family (description, _gtk_css_string_value_get (_gtk_css_array_value_get_nth (v, 0))); pango_font_description_set_family (description, _gtk_css_string_value_get (_gtk_css_array_value_get_nth (v, 0)));
} }
v = (* query_func) (_gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("-gtk-dpi"))), query_data);
dpi = _gtk_css_number_value_get (v, 96);
v = (* query_func) (_gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("font-size"))), query_data); v = (* query_func) (_gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("font-size"))), query_data);
if (v) if (v)
pango_font_description_set_size (description, round (_gtk_css_number_value_get (v, 100) * PANGO_SCALE)); pango_font_description_set_size (description, round (_gtk_css_number_value_get (v, 100) * PANGO_SCALE * 72 / dpi));
v = (* query_func) (_gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("font-style"))), query_data); v = (* query_func) (_gtk_css_style_property_get_id (GTK_CSS_STYLE_PROPERTY (_gtk_style_property_lookup ("font-style"))), query_data);
if (v) if (v)