cssvalue: Parse font sizes properly
As the last CSS property, font-size now is a proper number (when it's not a keyword).
This commit is contained in:
@ -133,8 +133,8 @@ _gtk_css_border_style_value_get (const GtkCssValue *value)
|
|||||||
*/
|
*/
|
||||||
#define DEFAULT_FONT_SIZE 10
|
#define DEFAULT_FONT_SIZE 10
|
||||||
|
|
||||||
static double
|
double
|
||||||
get_default_font_size (GtkStyleProviderPrivate *provider)
|
_gtk_css_font_size_get_default (GtkStyleProviderPrivate *provider)
|
||||||
{
|
{
|
||||||
GtkSettings *settings;
|
GtkSettings *settings;
|
||||||
PangoFontDescription *description;
|
PangoFontDescription *description;
|
||||||
@ -173,35 +173,35 @@ 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 = get_default_font_size (provider) * 3. / 5;
|
font_size = _gtk_css_font_size_get_default (provider) * 3. / 5;
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_X_SMALL:
|
case GTK_CSS_FONT_SIZE_X_SMALL:
|
||||||
font_size = get_default_font_size (provider) * 3. / 4;
|
font_size = _gtk_css_font_size_get_default (provider) * 3. / 4;
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_SMALL:
|
case GTK_CSS_FONT_SIZE_SMALL:
|
||||||
font_size = get_default_font_size (provider) * 8. / 9;
|
font_size = _gtk_css_font_size_get_default (provider) * 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 = get_default_font_size (provider);
|
font_size = _gtk_css_font_size_get_default (provider);
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_LARGE:
|
case GTK_CSS_FONT_SIZE_LARGE:
|
||||||
font_size = get_default_font_size (provider) * 6. / 5;
|
font_size = _gtk_css_font_size_get_default (provider) * 6. / 5;
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_X_LARGE:
|
case GTK_CSS_FONT_SIZE_X_LARGE:
|
||||||
font_size = get_default_font_size (provider) * 3. / 2;
|
font_size = _gtk_css_font_size_get_default (provider) * 3. / 2;
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_XX_LARGE:
|
case GTK_CSS_FONT_SIZE_XX_LARGE:
|
||||||
font_size = get_default_font_size (provider) * 2;
|
font_size = _gtk_css_font_size_get_default (provider) * 2;
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FONT_SIZE_SMALLER:
|
case GTK_CSS_FONT_SIZE_SMALLER:
|
||||||
*dependencies = GTK_CSS_DEPENDS_ON_PARENT;
|
*dependencies = GTK_CSS_DEPENDS_ON_PARENT;
|
||||||
if (parent_values)
|
if (parent_values)
|
||||||
font_size = _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
font_size = _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
||||||
else
|
else
|
||||||
font_size = get_default_font_size (provider);
|
font_size = _gtk_css_font_size_get_default (provider);
|
||||||
/* XXX: This is what WebKit does... */
|
/* XXX: This is what WebKit does... */
|
||||||
font_size *= 1.2;
|
font_size *= 1.2;
|
||||||
break;
|
break;
|
||||||
@ -210,7 +210,7 @@ gtk_css_value_font_size_compute (GtkCssValue *value,
|
|||||||
if (parent_values)
|
if (parent_values)
|
||||||
font_size = _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
font_size = _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
||||||
else
|
else
|
||||||
font_size = get_default_font_size (provider);
|
font_size = _gtk_css_font_size_get_default (provider);
|
||||||
/* XXX: This is what WebKit does... */
|
/* XXX: This is what WebKit does... */
|
||||||
font_size /= 1.2;
|
font_size /= 1.2;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -34,6 +34,7 @@ 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);
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
#include "gtkcssnumbervalueprivate.h"
|
#include "gtkcssnumbervalueprivate.h"
|
||||||
|
|
||||||
#include "gtkcssenumvalueprivate.h"
|
#include "gtkcssenumvalueprivate.h"
|
||||||
|
#include "gtkcssinitialvalueprivate.h"
|
||||||
#include "gtkstylepropertyprivate.h"
|
#include "gtkstylepropertyprivate.h"
|
||||||
|
|
||||||
struct _GtkCssValue {
|
struct _GtkCssValue {
|
||||||
@ -34,6 +35,26 @@ gtk_css_value_number_free (GtkCssValue *value)
|
|||||||
g_slice_free (GtkCssValue, value);
|
g_slice_free (GtkCssValue, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
get_base_font_size (guint property_id,
|
||||||
|
GtkStyleProviderPrivate *provider,
|
||||||
|
GtkCssComputedValues *values,
|
||||||
|
GtkCssComputedValues *parent_values,
|
||||||
|
GtkCssDependencies *dependencies)
|
||||||
|
{
|
||||||
|
if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
|
||||||
|
{
|
||||||
|
*dependencies = GTK_CSS_DEPENDS_ON_PARENT;
|
||||||
|
if (parent_values)
|
||||||
|
return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
||||||
|
else
|
||||||
|
return _gtk_css_font_size_get_default (provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
*dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
|
||||||
|
return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
|
||||||
|
}
|
||||||
|
|
||||||
static GtkCssValue *
|
static GtkCssValue *
|
||||||
gtk_css_value_number_compute (GtkCssValue *number,
|
gtk_css_value_number_compute (GtkCssValue *number,
|
||||||
guint property_id,
|
guint property_id,
|
||||||
@ -48,6 +69,11 @@ gtk_css_value_number_compute (GtkCssValue *number,
|
|||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case GTK_CSS_PERCENT:
|
case GTK_CSS_PERCENT:
|
||||||
|
/* percentages for font sizes are computed, other percentages aren't */
|
||||||
|
if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
|
||||||
|
return _gtk_css_number_value_new (number->value / 100.0 *
|
||||||
|
get_base_font_size (property_id, provider, values, parent_values, dependencies),
|
||||||
|
GTK_CSS_PX);
|
||||||
case GTK_CSS_NUMBER:
|
case GTK_CSS_NUMBER:
|
||||||
case GTK_CSS_PX:
|
case GTK_CSS_PX:
|
||||||
case GTK_CSS_DEG:
|
case GTK_CSS_DEG:
|
||||||
@ -73,16 +99,14 @@ gtk_css_value_number_compute (GtkCssValue *number,
|
|||||||
GTK_CSS_PX);
|
GTK_CSS_PX);
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_EM:
|
case GTK_CSS_EM:
|
||||||
*dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
|
|
||||||
return _gtk_css_number_value_new (number->value *
|
return _gtk_css_number_value_new (number->value *
|
||||||
_gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100),
|
get_base_font_size (property_id, provider, values, parent_values, dependencies),
|
||||||
GTK_CSS_PX);
|
GTK_CSS_PX);
|
||||||
break;
|
break;
|
||||||
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 */
|
||||||
*dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
|
|
||||||
return _gtk_css_number_value_new (number->value * 0.5 *
|
return _gtk_css_number_value_new (number->value * 0.5 *
|
||||||
_gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100),
|
get_base_font_size (property_id, provider, values, parent_values, dependencies),
|
||||||
GTK_CSS_PX);
|
GTK_CSS_PX);
|
||||||
case GTK_CSS_RAD:
|
case GTK_CSS_RAD:
|
||||||
return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI),
|
return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI),
|
||||||
|
|||||||
@ -649,19 +649,16 @@ font_size_parse (GtkCssStyleProperty *property,
|
|||||||
GtkCssParser *parser)
|
GtkCssParser *parser)
|
||||||
{
|
{
|
||||||
GtkCssValue *value;
|
GtkCssValue *value;
|
||||||
gdouble d;
|
|
||||||
|
|
||||||
value = _gtk_css_font_size_value_try_parse (parser);
|
value = _gtk_css_font_size_value_try_parse (parser);
|
||||||
if (value)
|
if (value)
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
if (!_gtk_css_parser_try_double (parser, &d))
|
return _gtk_css_number_value_parse (parser,
|
||||||
{
|
GTK_CSS_PARSE_LENGTH
|
||||||
_gtk_css_parser_error (parser, "Expected a number");
|
| GTK_CSS_PARSE_PERCENT
|
||||||
return NULL;
|
| GTK_CSS_POSITIVE_ONLY
|
||||||
}
|
| GTK_CSS_NUMBER_AS_PIXELS);
|
||||||
|
|
||||||
return _gtk_css_number_value_new (d, GTK_CSS_PX);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkCssValue *
|
static GtkCssValue *
|
||||||
|
|||||||
Reference in New Issue
Block a user