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
get_base_font_size (guint property_id,
get_base_font_size_px (guint property_id,
GtkStyleProviderPrivate *provider,
GtkCssStyle *style,
GtkCssStyle *parent_style)
@ -47,7 +47,7 @@ get_base_font_size (guint property_id,
if (parent_style)
return _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
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);
@ -109,7 +109,7 @@ gtk_css_value_dimension_compute (GtkCssValue *number,
/* percentages for font sizes are computed, other percentages aren't */
if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
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);
case GTK_CSS_NUMBER:
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,
GTK_CSS_PX);
case GTK_CSS_EM:
return gtk_css_dimension_value_new (number->value * get_dpi (style) / 72.0 *
get_base_font_size (property_id, provider, style, parent_style),
return gtk_css_dimension_value_new (number->value *
get_base_font_size_px (property_id, provider, style, parent_style),
GTK_CSS_PX);
case GTK_CSS_EX:
/* for now we pretend ex is half of em */
return gtk_css_dimension_value_new (number->value * 0.5 * get_dpi (style) / 72.0 *
get_base_font_size (property_id, provider, style, parent_style),
return gtk_css_dimension_value_new (number->value * 0.5 *
get_base_font_size_px (property_id, provider, style, parent_style),
GTK_CSS_PX);
case GTK_CSS_REM:
return gtk_css_dimension_value_new (number->value * get_dpi (style) / 72.0 *
_gtk_css_font_size_get_default (provider),
return gtk_css_dimension_value_new (number->value *
gtk_css_font_size_get_default_px (provider, style),
GTK_CSS_PX);
case GTK_CSS_RAD:
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 */
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
* size code to appear in gtkcssvalueenum.c.
*/
#define DEFAULT_FONT_SIZE 10
#define DEFAULT_FONT_SIZE_PT 10
double
_gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider)
gtk_css_font_size_get_default_px (GtkStyleProviderPrivate *provider,
GtkCssStyle *style)
{
GtkSettings *settings;
PangoFontDescription *description;
@ -142,18 +149,22 @@ _gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider)
settings = _gtk_style_provider_private_get_settings (provider);
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);
description = pango_font_description_from_string (font_name);
g_free (font_name);
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)
{
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
font_size = DEFAULT_FONT_SIZE;
font_size = DEFAULT_FONT_SIZE_PT * get_dpi (style) / 72.0;
pango_font_description_free (description);
return font_size;
@ -171,34 +182,34 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
switch (value->value)
{
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;
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;
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;
default:
g_assert_not_reached ();
/* fall thru */
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;
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;
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;
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;
case GTK_CSS_FONT_SIZE_SMALLER:
if (parent_style)
font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
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... */
font_size /= 1.2;
break;
@ -206,7 +217,7 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
if (parent_style)
font_size = _gtk_css_number_value_get (gtk_css_style_get_value (parent_style, GTK_CSS_PROPERTY_FONT_SIZE), 100);
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... */
font_size *= 1.2;
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_try_parse (GtkCssParser *parser);
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_try_parse (GtkCssParser *parser);

View File

@ -1074,6 +1074,7 @@ pack_font_description (GtkCssShorthandProperty *shorthand,
{
PangoFontDescription *description;
GtkCssValue *v;
double dpi;
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)));
}
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);
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);
if (v)