mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 12:57:35 +00:00
LibWeb: Parse CSS "font-variant" as part of "font"
This allows us to parse CSS "font" values that contain e.g "small-caps" or "normal", as used on Acid3.
This commit is contained in:
parent
632928a11e
commit
5118a4c1e7
6 changed files with 37 additions and 1 deletions
|
@ -16,6 +16,7 @@ class InitialValues {
|
||||||
public:
|
public:
|
||||||
static float font_size() { return 10; }
|
static float font_size() { return 10; }
|
||||||
static int font_weight() { return 400; }
|
static int font_weight() { return 400; }
|
||||||
|
static CSS::FontVariant font_variant() { return CSS::FontVariant::Normal; }
|
||||||
static CSS::Float float_() { return CSS::Float::None; }
|
static CSS::Float float_() { return CSS::Float::None; }
|
||||||
static CSS::Clear clear() { return CSS::Clear::None; }
|
static CSS::Clear clear() { return CSS::Clear::None; }
|
||||||
static CSS::Cursor cursor() { return CSS::Cursor::Auto; }
|
static CSS::Cursor cursor() { return CSS::Cursor::Auto; }
|
||||||
|
@ -178,6 +179,7 @@ public:
|
||||||
|
|
||||||
float font_size() const { return m_inherited.font_size; }
|
float font_size() const { return m_inherited.font_size; }
|
||||||
int font_weight() const { return m_inherited.font_weight; }
|
int font_weight() const { return m_inherited.font_weight; }
|
||||||
|
CSS::FontVariant font_variant() const { return m_inherited.font_variant; }
|
||||||
|
|
||||||
ComputedValues clone_inherited_values() const
|
ComputedValues clone_inherited_values() const
|
||||||
{
|
{
|
||||||
|
@ -190,6 +192,7 @@ protected:
|
||||||
struct {
|
struct {
|
||||||
float font_size { InitialValues::font_size() };
|
float font_size { InitialValues::font_size() };
|
||||||
int font_weight { InitialValues::font_weight() };
|
int font_weight { InitialValues::font_weight() };
|
||||||
|
CSS::FontVariant font_variant { InitialValues::font_variant() };
|
||||||
Color color { InitialValues::color() };
|
Color color { InitialValues::color() };
|
||||||
CSS::Cursor cursor { InitialValues::cursor() };
|
CSS::Cursor cursor { InitialValues::cursor() };
|
||||||
CSS::ImageRendering image_rendering { InitialValues::image_rendering() };
|
CSS::ImageRendering image_rendering { InitialValues::image_rendering() };
|
||||||
|
@ -261,6 +264,7 @@ class MutableComputedValues final : public ComputedValues {
|
||||||
public:
|
public:
|
||||||
void set_font_size(float font_size) { m_inherited.font_size = font_size; }
|
void set_font_size(float font_size) { m_inherited.font_size = font_size; }
|
||||||
void set_font_weight(int font_weight) { m_inherited.font_weight = font_weight; }
|
void set_font_weight(int font_weight) { m_inherited.font_weight = font_weight; }
|
||||||
|
void set_font_variant(CSS::FontVariant font_variant) { m_inherited.font_variant = font_variant; }
|
||||||
void set_color(const Color& color) { m_inherited.color = color; }
|
void set_color(const Color& color) { m_inherited.color = color; }
|
||||||
void set_content(ContentData const& content) { m_noninherited.content = content; }
|
void set_content(ContentData const& content) { m_noninherited.content = content; }
|
||||||
void set_cursor(CSS::Cursor cursor) { m_inherited.cursor = cursor; }
|
void set_cursor(CSS::Cursor cursor) { m_inherited.cursor = cursor; }
|
||||||
|
|
|
@ -3590,7 +3590,8 @@ RefPtr<StyleValue> Parser::parse_font_value(Vector<StyleComponentValueRule> cons
|
||||||
RefPtr<StyleValue> font_size;
|
RefPtr<StyleValue> font_size;
|
||||||
RefPtr<StyleValue> line_height;
|
RefPtr<StyleValue> line_height;
|
||||||
RefPtr<StyleValue> font_families;
|
RefPtr<StyleValue> font_families;
|
||||||
// FIXME: Implement font-stretch and font-variant.
|
RefPtr<StyleValue> font_variant;
|
||||||
|
// FIXME: Implement font-stretch.
|
||||||
|
|
||||||
// FIXME: Handle system fonts. (caption, icon, menu, message-box, small-caption, status-bar)
|
// FIXME: Handle system fonts. (caption, icon, menu, message-box, small-caption, status-bar)
|
||||||
|
|
||||||
|
@ -3620,6 +3621,12 @@ RefPtr<StyleValue> Parser::parse_font_value(Vector<StyleComponentValueRule> cons
|
||||||
font_weight = value.release_nonnull();
|
font_weight = value.release_nonnull();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (property_accepts_value(PropertyID::FontVariant, *value)) {
|
||||||
|
if (font_variant)
|
||||||
|
return nullptr;
|
||||||
|
font_variant = value.release_nonnull();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (property_accepts_value(PropertyID::FontSize, *value)) {
|
if (property_accepts_value(PropertyID::FontSize, *value)) {
|
||||||
if (font_size)
|
if (font_size)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -999,4 +999,20 @@ Variant<CSS::VerticalAlign, CSS::LengthPercentage> StyleProperties::vertical_ali
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<CSS::FontVariant> StyleProperties::font_variant() const
|
||||||
|
{
|
||||||
|
auto value = property(CSS::PropertyID::FontVariant);
|
||||||
|
if (!value.has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
switch (value.value()->to_identifier()) {
|
||||||
|
case CSS::ValueID::Normal:
|
||||||
|
return CSS::FontVariant::Normal;
|
||||||
|
case CSS::ValueID::SmallCaps:
|
||||||
|
return CSS::FontVariant::SmallCaps;
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,7 @@ public:
|
||||||
CSS::BoxSizing box_sizing() const;
|
CSS::BoxSizing box_sizing() const;
|
||||||
Optional<CSS::PointerEvents> pointer_events() const;
|
Optional<CSS::PointerEvents> pointer_events() const;
|
||||||
Variant<CSS::VerticalAlign, CSS::LengthPercentage> vertical_align() const;
|
Variant<CSS::VerticalAlign, CSS::LengthPercentage> vertical_align() const;
|
||||||
|
Optional<CSS::FontVariant> font_variant() const;
|
||||||
|
|
||||||
Vector<CSS::Transformation> transformations() const;
|
Vector<CSS::Transformation> transformations() const;
|
||||||
CSS::TransformOrigin transform_origin() const;
|
CSS::TransformOrigin transform_origin() const;
|
||||||
|
|
|
@ -146,6 +146,11 @@ enum class Float {
|
||||||
Right,
|
Right,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class FontVariant {
|
||||||
|
Normal,
|
||||||
|
SmallCaps,
|
||||||
|
};
|
||||||
|
|
||||||
enum class ImageRendering {
|
enum class ImageRendering {
|
||||||
Auto,
|
Auto,
|
||||||
CrispEdges,
|
CrispEdges,
|
||||||
|
|
|
@ -363,6 +363,9 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style)
|
||||||
computed_values.set_font_size(specified_style.property(CSS::PropertyID::FontSize).value()->to_length().to_px(*this));
|
computed_values.set_font_size(specified_style.property(CSS::PropertyID::FontSize).value()->to_length().to_px(*this));
|
||||||
computed_values.set_font_weight(specified_style.property(CSS::PropertyID::FontWeight).value()->to_integer());
|
computed_values.set_font_weight(specified_style.property(CSS::PropertyID::FontWeight).value()->to_integer());
|
||||||
|
|
||||||
|
if (auto maybe_font_variant = specified_style.font_variant(); maybe_font_variant.has_value())
|
||||||
|
computed_values.set_font_variant(maybe_font_variant.release_value());
|
||||||
|
|
||||||
// FIXME: BorderXRadius properties are now BorderRadiusStyleValues, so make use of that.
|
// FIXME: BorderXRadius properties are now BorderRadiusStyleValues, so make use of that.
|
||||||
auto border_bottom_left_radius = specified_style.property(CSS::PropertyID::BorderBottomLeftRadius);
|
auto border_bottom_left_radius = specified_style.property(CSS::PropertyID::BorderBottomLeftRadius);
|
||||||
if (border_bottom_left_radius.has_value() && border_bottom_left_radius.value()->is_border_radius())
|
if (border_bottom_left_radius.has_value() && border_bottom_left_radius.value()->is_border_radius())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue