forked from AuroraMiddleware/gtk
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:
parent
f9ba55eaad
commit
df08fc91bd
@ -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),
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user