mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Use generics for the vertical-align property
This commit is contained in:
parent
19cbea23a8
commit
542a9337a4
13 changed files with 202 additions and 178 deletions
|
@ -42,7 +42,7 @@ use std::collections::LinkedList;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use style::computed_values::{border_collapse, box_sizing, clear, color, display, mix_blend_mode};
|
use style::computed_values::{border_collapse, box_sizing, clear, color, display, mix_blend_mode};
|
||||||
use style::computed_values::{overflow_wrap, overflow_x, position, text_decoration_line};
|
use style::computed_values::{overflow_wrap, overflow_x, position, text_decoration_line};
|
||||||
use style::computed_values::{transform_style, vertical_align, white_space, word_break};
|
use style::computed_values::{transform_style, white_space, word_break};
|
||||||
use style::computed_values::content::ContentItem;
|
use style::computed_values::content::ContentItem;
|
||||||
use style::logical_geometry::{Direction, LogicalMargin, LogicalRect, LogicalSize, WritingMode};
|
use style::logical_geometry::{Direction, LogicalMargin, LogicalRect, LogicalSize, WritingMode};
|
||||||
use style::properties::ComputedValues;
|
use style::properties::ComputedValues;
|
||||||
|
@ -52,6 +52,7 @@ use style::servo::restyle_damage::RECONSTRUCT_FLOW;
|
||||||
use style::str::char_is_whitespace;
|
use style::str::char_is_whitespace;
|
||||||
use style::values::{self, Either, Auto};
|
use style::values::{self, Either, Auto};
|
||||||
use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
||||||
|
use style::values::generics::box_::VerticalAlign;
|
||||||
use text;
|
use text;
|
||||||
use text::TextRunScanner;
|
use text::TextRunScanner;
|
||||||
use webrender_api;
|
use webrender_api;
|
||||||
|
@ -2222,8 +2223,8 @@ impl Fragment {
|
||||||
// FIXME(#5624, pcwalton): This passes our current reftests but isn't the right thing
|
// FIXME(#5624, pcwalton): This passes our current reftests but isn't the right thing
|
||||||
// to do.
|
// to do.
|
||||||
match style.get_box().vertical_align {
|
match style.get_box().vertical_align {
|
||||||
vertical_align::T::baseline => {}
|
VerticalAlign::Baseline => {}
|
||||||
vertical_align::T::middle => {
|
VerticalAlign::Middle => {
|
||||||
let font_metrics = with_thread_local_font_context(layout_context, |font_context| {
|
let font_metrics = with_thread_local_font_context(layout_context, |font_context| {
|
||||||
text::font_metrics_for_style(font_context, self.style.clone_font())
|
text::font_metrics_for_style(font_context, self.style.clone_font())
|
||||||
});
|
});
|
||||||
|
@ -2231,42 +2232,41 @@ impl Fragment {
|
||||||
content_inline_metrics.space_below_baseline -
|
content_inline_metrics.space_below_baseline -
|
||||||
font_metrics.x_height).scale_by(0.5)
|
font_metrics.x_height).scale_by(0.5)
|
||||||
}
|
}
|
||||||
vertical_align::T::sub => {
|
VerticalAlign::Sub => {
|
||||||
offset += minimum_line_metrics.space_needed()
|
offset += minimum_line_metrics.space_needed()
|
||||||
.scale_by(FONT_SUBSCRIPT_OFFSET_RATIO)
|
.scale_by(FONT_SUBSCRIPT_OFFSET_RATIO)
|
||||||
}
|
}
|
||||||
vertical_align::T::super_ => {
|
VerticalAlign::Super => {
|
||||||
offset -= minimum_line_metrics.space_needed()
|
offset -= minimum_line_metrics.space_needed()
|
||||||
.scale_by(FONT_SUPERSCRIPT_OFFSET_RATIO)
|
.scale_by(FONT_SUPERSCRIPT_OFFSET_RATIO)
|
||||||
}
|
}
|
||||||
vertical_align::T::text_top => {
|
VerticalAlign::TextTop => {
|
||||||
offset = self.content_inline_metrics(layout_context).ascent -
|
offset = self.content_inline_metrics(layout_context).ascent -
|
||||||
minimum_line_metrics.space_above_baseline
|
minimum_line_metrics.space_above_baseline
|
||||||
}
|
}
|
||||||
vertical_align::T::text_bottom => {
|
VerticalAlign::TextBottom => {
|
||||||
offset = minimum_line_metrics.space_below_baseline -
|
offset = minimum_line_metrics.space_below_baseline -
|
||||||
self.content_inline_metrics(layout_context).space_below_baseline
|
self.content_inline_metrics(layout_context).space_below_baseline
|
||||||
}
|
}
|
||||||
vertical_align::T::top => {
|
VerticalAlign::Top => {
|
||||||
if let Some(actual_line_metrics) = actual_line_metrics {
|
if let Some(actual_line_metrics) = actual_line_metrics {
|
||||||
offset = content_inline_metrics.ascent -
|
offset = content_inline_metrics.ascent -
|
||||||
actual_line_metrics.space_above_baseline
|
actual_line_metrics.space_above_baseline
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vertical_align::T::bottom => {
|
VerticalAlign::Bottom => {
|
||||||
if let Some(actual_line_metrics) = actual_line_metrics {
|
if let Some(actual_line_metrics) = actual_line_metrics {
|
||||||
offset = actual_line_metrics.space_below_baseline -
|
offset = actual_line_metrics.space_below_baseline -
|
||||||
content_inline_metrics.space_below_baseline
|
content_inline_metrics.space_below_baseline
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vertical_align::T::LengthOrPercentage(LengthOrPercentage::Length(length)) => {
|
VerticalAlign::Length(LengthOrPercentage::Length(length)) => {
|
||||||
offset -= length
|
offset -= length
|
||||||
}
|
}
|
||||||
vertical_align::T::LengthOrPercentage(LengthOrPercentage::Percentage(
|
VerticalAlign::Length(LengthOrPercentage::Percentage(percentage)) => {
|
||||||
percentage)) => {
|
|
||||||
offset -= minimum_line_metrics.space_needed().scale_by(percentage.0)
|
offset -= minimum_line_metrics.space_needed().scale_by(percentage.0)
|
||||||
}
|
}
|
||||||
vertical_align::T::LengthOrPercentage(LengthOrPercentage::Calc(formula)) => {
|
VerticalAlign::Length(LengthOrPercentage::Calc(formula)) => {
|
||||||
offset -= formula.to_used_value(Some(minimum_line_metrics.space_needed())).unwrap()
|
offset -= formula.to_used_value(Some(minimum_line_metrics.space_needed())).unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2824,13 +2824,13 @@ impl Fragment {
|
||||||
/// `vertical-align` set to `top` or `bottom`.
|
/// `vertical-align` set to `top` or `bottom`.
|
||||||
pub fn is_vertically_aligned_to_top_or_bottom(&self) -> bool {
|
pub fn is_vertically_aligned_to_top_or_bottom(&self) -> bool {
|
||||||
match self.style.get_box().vertical_align {
|
match self.style.get_box().vertical_align {
|
||||||
vertical_align::T::top | vertical_align::T::bottom => return true,
|
VerticalAlign::Top | VerticalAlign::Bottom => return true,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
if let Some(ref inline_context) = self.inline_context {
|
if let Some(ref inline_context) = self.inline_context {
|
||||||
for node in &inline_context.nodes {
|
for node in &inline_context.nodes {
|
||||||
match node.style.get_box().vertical_align {
|
match node.style.get_box().vertical_align {
|
||||||
vertical_align::T::top | vertical_align::T::bottom => return true,
|
VerticalAlign::Top | VerticalAlign::Bottom => return true,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ use style::computed_values::{vertical_align, white_space};
|
||||||
use style::logical_geometry::{LogicalRect, LogicalSize, WritingMode};
|
use style::logical_geometry::{LogicalRect, LogicalSize, WritingMode};
|
||||||
use style::properties::{longhands, ComputedValues};
|
use style::properties::{longhands, ComputedValues};
|
||||||
use style::servo::restyle_damage::{BUBBLE_ISIZES, REFLOW, REFLOW_OUT_OF_FLOW, RESOLVE_GENERATED_CONTENT};
|
use style::servo::restyle_damage::{BUBBLE_ISIZES, REFLOW, REFLOW_OUT_OF_FLOW, RESOLVE_GENERATED_CONTENT};
|
||||||
|
use style::values::generics::box_::VerticalAlign;
|
||||||
use text;
|
use text;
|
||||||
use traversal::PreorderFlowTraversal;
|
use traversal::PreorderFlowTraversal;
|
||||||
use unicode_bidi as bidi;
|
use unicode_bidi as bidi;
|
||||||
|
@ -1136,12 +1137,12 @@ impl InlineFlow {
|
||||||
let mut largest_block_size_for_top_fragments = Au(0);
|
let mut largest_block_size_for_top_fragments = Au(0);
|
||||||
let mut largest_block_size_for_bottom_fragments = Au(0);
|
let mut largest_block_size_for_bottom_fragments = Au(0);
|
||||||
|
|
||||||
// We use `vertical_align::T::baseline` here because `vertical-align` must not apply to
|
// We use `VerticalAlign::Baseline` here because `vertical-align` must
|
||||||
// the inside of inline blocks.
|
// not apply to the inside of inline blocks.
|
||||||
update_line_metrics_for_fragment(&mut line_metrics,
|
update_line_metrics_for_fragment(&mut line_metrics,
|
||||||
&inline_metrics,
|
&inline_metrics,
|
||||||
style.get_box().display,
|
style.get_box().display,
|
||||||
vertical_align::T::baseline,
|
VerticalAlign::Baseline,
|
||||||
&mut largest_block_size_for_top_fragments,
|
&mut largest_block_size_for_top_fragments,
|
||||||
&mut largest_block_size_for_bottom_fragments);
|
&mut largest_block_size_for_bottom_fragments);
|
||||||
|
|
||||||
|
@ -1182,19 +1183,19 @@ impl InlineFlow {
|
||||||
largest_block_size_for_top_fragments: &mut Au,
|
largest_block_size_for_top_fragments: &mut Au,
|
||||||
largest_block_size_for_bottom_fragments: &mut Au) {
|
largest_block_size_for_bottom_fragments: &mut Au) {
|
||||||
match (display_value, vertical_align_value) {
|
match (display_value, vertical_align_value) {
|
||||||
(display::T::inline, vertical_align::T::top) |
|
(display::T::inline, VerticalAlign::Top) |
|
||||||
(display::T::block, vertical_align::T::top) |
|
(display::T::block, VerticalAlign::Top) |
|
||||||
(display::T::inline_flex, vertical_align::T::top) |
|
(display::T::inline_flex, VerticalAlign::Top) |
|
||||||
(display::T::inline_block, vertical_align::T::top) if
|
(display::T::inline_block, VerticalAlign::Top) if
|
||||||
inline_metrics.space_above_baseline >= Au(0) => {
|
inline_metrics.space_above_baseline >= Au(0) => {
|
||||||
*largest_block_size_for_top_fragments = max(
|
*largest_block_size_for_top_fragments = max(
|
||||||
*largest_block_size_for_top_fragments,
|
*largest_block_size_for_top_fragments,
|
||||||
inline_metrics.space_above_baseline + inline_metrics.space_below_baseline)
|
inline_metrics.space_above_baseline + inline_metrics.space_below_baseline)
|
||||||
}
|
}
|
||||||
(display::T::inline, vertical_align::T::bottom) |
|
(display::T::inline, VerticalAlign::Bottom) |
|
||||||
(display::T::block, vertical_align::T::bottom) |
|
(display::T::block, VerticalAlign::Bottom) |
|
||||||
(display::T::inline_flex, vertical_align::T::bottom) |
|
(display::T::inline_flex, VerticalAlign::Bottom) |
|
||||||
(display::T::inline_block, vertical_align::T::bottom) if
|
(display::T::inline_block, VerticalAlign::Bottom) if
|
||||||
inline_metrics.space_below_baseline >= Au(0) => {
|
inline_metrics.space_below_baseline >= Au(0) => {
|
||||||
*largest_block_size_for_bottom_fragments = max(
|
*largest_block_size_for_bottom_fragments = max(
|
||||||
*largest_block_size_for_bottom_fragments,
|
*largest_block_size_for_bottom_fragments,
|
||||||
|
|
|
@ -18,10 +18,11 @@ use layout_debug;
|
||||||
use model::MaybeAuto;
|
use model::MaybeAuto;
|
||||||
use script_layout_interface::wrapper_traits::ThreadSafeLayoutNode;
|
use script_layout_interface::wrapper_traits::ThreadSafeLayoutNode;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use style::computed_values::{border_collapse, border_top_style, vertical_align};
|
use style::computed_values::{border_collapse, border_top_style};
|
||||||
use style::logical_geometry::{LogicalMargin, LogicalRect, LogicalSize, WritingMode};
|
use style::logical_geometry::{LogicalMargin, LogicalRect, LogicalSize, WritingMode};
|
||||||
use style::properties::ComputedValues;
|
use style::properties::ComputedValues;
|
||||||
use style::values::computed::Color;
|
use style::values::computed::Color;
|
||||||
|
use style::values::generics::box_::VerticalAlign;
|
||||||
use table::InternalTable;
|
use table::InternalTable;
|
||||||
use table_row::{CollapsedBorder, CollapsedBorderProvenance};
|
use table_row::{CollapsedBorder, CollapsedBorderProvenance};
|
||||||
|
|
||||||
|
@ -124,11 +125,11 @@ impl TableCellFlow {
|
||||||
self.block_flow.fragment.border_padding.block_start_end();
|
self.block_flow.fragment.border_padding.block_start_end();
|
||||||
let kids_self_gap = self_size - kids_size;
|
let kids_self_gap = self_size - kids_size;
|
||||||
|
|
||||||
// This offset should also account for vertical_align::T::baseline.
|
// This offset should also account for VerticalAlign::Baseline.
|
||||||
// Need max cell ascent from the first row of this cell.
|
// Need max cell ascent from the first row of this cell.
|
||||||
let offset = match self.block_flow.fragment.style().get_box().vertical_align {
|
let offset = match self.block_flow.fragment.style().get_box().vertical_align {
|
||||||
vertical_align::T::middle => kids_self_gap / 2,
|
VerticalAlign::Middle => kids_self_gap / 2,
|
||||||
vertical_align::T::bottom => kids_self_gap,
|
VerticalAlign::Bottom => kids_self_gap,
|
||||||
_ => Au(0),
|
_ => Au(0),
|
||||||
};
|
};
|
||||||
if offset == Au(0) {
|
if offset == Au(0) {
|
||||||
|
|
|
@ -12,13 +12,14 @@ use app_units::Au;
|
||||||
use gecko::values::{convert_rgba_to_nscolor, GeckoStyleCoordConvertible};
|
use gecko::values::{convert_rgba_to_nscolor, GeckoStyleCoordConvertible};
|
||||||
use gecko_bindings::bindings::{Gecko_CreateGradient, Gecko_SetGradientImageValue, Gecko_SetLayerImageImageValue};
|
use gecko_bindings::bindings::{Gecko_CreateGradient, Gecko_SetGradientImageValue, Gecko_SetLayerImageImageValue};
|
||||||
use gecko_bindings::bindings::{Gecko_InitializeImageCropRect, Gecko_SetImageElement};
|
use gecko_bindings::bindings::{Gecko_InitializeImageCropRect, Gecko_SetImageElement};
|
||||||
use gecko_bindings::structs::{nsCSSUnit, nsStyleCoord_CalcValue, nsStyleImage};
|
use gecko_bindings::structs::{self, nsCSSUnit, nsStyleCoord_CalcValue};
|
||||||
use gecko_bindings::structs::{nsresult, SheetType};
|
use gecko_bindings::structs::{nsStyleImage, nsresult, SheetType};
|
||||||
use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
|
use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
use stylesheets::{Origin, RulesMutateError};
|
use stylesheets::{Origin, RulesMutateError};
|
||||||
use values::computed::{Angle, CalcLengthOrPercentage, Gradient, Image};
|
use values::computed::{Angle, CalcLengthOrPercentage, Gradient, Image};
|
||||||
use values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto, Percentage};
|
use values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto, Percentage};
|
||||||
|
use values::generics::box_::VerticalAlign;
|
||||||
use values::generics::grid::TrackSize;
|
use values::generics::grid::TrackSize;
|
||||||
use values::generics::image::{CompatMode, Image as GenericImage, GradientItem};
|
use values::generics::image::{CompatMode, Image as GenericImage, GradientItem};
|
||||||
use values::generics::rect::Rect;
|
use values::generics::rect::Rect;
|
||||||
|
@ -920,6 +921,26 @@ impl<T> Rect<T> where T: GeckoStyleCoordConvertible {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<L> VerticalAlign<L> {
|
||||||
|
/// Converts an enumerated value coming from Gecko to a `VerticalAlign<L>`.
|
||||||
|
pub fn from_gecko_keyword(value: u32) -> Self {
|
||||||
|
match value {
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_BASELINE => VerticalAlign::Baseline,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_SUB => VerticalAlign::Sub,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_SUPER => VerticalAlign::Super,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_TOP => VerticalAlign::Top,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_TEXT_TOP => VerticalAlign::TextTop,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_MIDDLE => VerticalAlign::Middle,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_BOTTOM => VerticalAlign::Bottom,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_TEXT_BOTTOM => VerticalAlign::TextBottom,
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_MIDDLE_WITH_BASELINE => {
|
||||||
|
VerticalAlign::MozMiddleWithBaseline
|
||||||
|
},
|
||||||
|
_ => panic!("unexpected enumerated value for vertical-align"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Convert to String from given chars pointer.
|
/// Convert to String from given chars pointer.
|
||||||
pub unsafe fn string_from_chars_pointer(p: *const u16) -> String {
|
pub unsafe fn string_from_chars_pointer(p: *const u16) -> String {
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
|
|
@ -2904,33 +2904,41 @@ fn static_assert() {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_vertical_align(&mut self, v: longhands::vertical_align::computed_value::T) {
|
pub fn set_vertical_align(&mut self, v: longhands::vertical_align::computed_value::T) {
|
||||||
<% keyword = data.longhands_by_name["vertical-align"].keyword %>
|
use values::generics::box_::VerticalAlign;
|
||||||
use properties::longhands::vertical_align::computed_value::T;
|
let value = match v {
|
||||||
// FIXME: Align binary representations and ditch |match| for cast + static_asserts
|
VerticalAlign::Baseline => structs::NS_STYLE_VERTICAL_ALIGN_BASELINE,
|
||||||
match v {
|
VerticalAlign::Sub => structs::NS_STYLE_VERTICAL_ALIGN_SUB,
|
||||||
% for value in keyword.values_for('gecko'):
|
VerticalAlign::Super => structs::NS_STYLE_VERTICAL_ALIGN_SUPER,
|
||||||
T::${to_rust_ident(value)} =>
|
VerticalAlign::Top => structs::NS_STYLE_VERTICAL_ALIGN_TOP,
|
||||||
self.gecko.mVerticalAlign.set_value(
|
VerticalAlign::TextTop => structs::NS_STYLE_VERTICAL_ALIGN_TEXT_TOP,
|
||||||
CoordDataValue::Enumerated(structs::${keyword.gecko_constant(value)})),
|
VerticalAlign::Middle => structs::NS_STYLE_VERTICAL_ALIGN_MIDDLE,
|
||||||
% endfor
|
VerticalAlign::Bottom => structs::NS_STYLE_VERTICAL_ALIGN_BOTTOM,
|
||||||
T::LengthOrPercentage(v) => self.gecko.mVerticalAlign.set(v),
|
VerticalAlign::TextBottom => structs::NS_STYLE_VERTICAL_ALIGN_TEXT_BOTTOM,
|
||||||
}
|
VerticalAlign::MozMiddleWithBaseline => {
|
||||||
|
structs::NS_STYLE_VERTICAL_ALIGN_MIDDLE_WITH_BASELINE
|
||||||
|
},
|
||||||
|
VerticalAlign::Length(length) => {
|
||||||
|
self.gecko.mVerticalAlign.set(length);
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
self.gecko.mVerticalAlign.set_value(CoordDataValue::Enumerated(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clone_vertical_align(&self) -> longhands::vertical_align::computed_value::T {
|
pub fn clone_vertical_align(&self) -> longhands::vertical_align::computed_value::T {
|
||||||
use properties::longhands::vertical_align::computed_value::T;
|
|
||||||
use values::computed::LengthOrPercentage;
|
use values::computed::LengthOrPercentage;
|
||||||
|
use values::generics::box_::VerticalAlign;
|
||||||
|
|
||||||
match self.gecko.mVerticalAlign.as_value() {
|
let gecko = &self.gecko.mVerticalAlign;
|
||||||
% for value in keyword.values_for('gecko'):
|
match gecko.as_value() {
|
||||||
CoordDataValue::Enumerated(structs::${keyword.gecko_constant(value)}) => T::${to_rust_ident(value)},
|
CoordDataValue::Enumerated(value) => VerticalAlign::from_gecko_keyword(value),
|
||||||
% endfor
|
_ => {
|
||||||
CoordDataValue::Enumerated(_) => panic!("Unexpected enum variant for vertical-align"),
|
VerticalAlign::Length(
|
||||||
_ => {
|
LengthOrPercentage::from_gecko_style_coord(gecko).expect(
|
||||||
let v = LengthOrPercentage::from_gecko_style_coord(&self.gecko.mVerticalAlign)
|
"expected <length-percentage> for vertical-align",
|
||||||
.expect("Expected length or percentage for vertical-align");
|
),
|
||||||
T::LengthOrPercentage(v)
|
)
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ use properties::longhands::line_height::computed_value::T as LineHeight;
|
||||||
use properties::longhands::transform::computed_value::ComputedMatrix;
|
use properties::longhands::transform::computed_value::ComputedMatrix;
|
||||||
use properties::longhands::transform::computed_value::ComputedOperation as TransformOperation;
|
use properties::longhands::transform::computed_value::ComputedOperation as TransformOperation;
|
||||||
use properties::longhands::transform::computed_value::T as TransformList;
|
use properties::longhands::transform::computed_value::T as TransformList;
|
||||||
use properties::longhands::vertical_align::computed_value::T as VerticalAlign;
|
|
||||||
use properties::longhands::visibility::computed_value::T as Visibility;
|
use properties::longhands::visibility::computed_value::T as Visibility;
|
||||||
#[cfg(feature = "gecko")] use properties::{PropertyId, PropertyDeclarationId, LonghandId};
|
#[cfg(feature = "gecko")] use properties::{PropertyId, PropertyDeclarationId, LonghandId};
|
||||||
#[cfg(feature = "gecko")] use properties::{ShorthandId};
|
#[cfg(feature = "gecko")] use properties::{ShorthandId};
|
||||||
|
@ -787,11 +786,6 @@ impl ToAnimatedZero for Visibility {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToAnimatedZero for VerticalAlign {
|
|
||||||
#[inline]
|
|
||||||
fn to_animated_zero(&self) -> Result<Self, ()> { Err(()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// https://drafts.csswg.org/css-transitions/#animtype-lpcalc
|
/// https://drafts.csswg.org/css-transitions/#animtype-lpcalc
|
||||||
impl Animate for CalcLengthOrPercentage {
|
impl Animate for CalcLengthOrPercentage {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -307,125 +307,15 @@ ${helpers.single_keyword("position", "static absolute relative fixed",
|
||||||
|
|
||||||
</%helpers:longhand>
|
</%helpers:longhand>
|
||||||
|
|
||||||
<%helpers:longhand name="vertical-align" animation_value_type="ComputedValue"
|
|
||||||
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
|
|
||||||
spec="https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align">
|
|
||||||
use std::fmt;
|
|
||||||
use style_traits::ToCss;
|
|
||||||
use values::specified::AllowQuirks;
|
|
||||||
|
|
||||||
<% vertical_align = data.longhands_by_name["vertical-align"] %>
|
|
||||||
<% vertical_align.keyword = Keyword("vertical-align",
|
|
||||||
"baseline sub super top text-top middle bottom text-bottom",
|
|
||||||
extra_gecko_values="-moz-middle-with-baseline") %>
|
|
||||||
<% vertical_align_keywords = vertical_align.keyword.values_for(product) %>
|
|
||||||
|
|
||||||
${helpers.gecko_keyword_conversion(vertical_align.keyword)}
|
|
||||||
|
|
||||||
/// The `vertical-align` value.
|
|
||||||
#[allow(non_camel_case_types)]
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
|
||||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
|
||||||
pub enum SpecifiedValue {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
${to_rust_ident(keyword)},
|
|
||||||
% endfor
|
|
||||||
LengthOrPercentage(specified::LengthOrPercentage),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToCss for SpecifiedValue {
|
|
||||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
|
||||||
match *self {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
SpecifiedValue::${to_rust_ident(keyword)} => dest.write_str("${keyword}"),
|
|
||||||
% endfor
|
|
||||||
SpecifiedValue::LengthOrPercentage(ref value) => value.to_css(dest),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// baseline | sub | super | top | text-top | middle | bottom | text-bottom
|
|
||||||
/// | <percentage> | <length>
|
|
||||||
pub fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>)
|
|
||||||
-> Result<SpecifiedValue, ParseError<'i>> {
|
|
||||||
if let Ok(lop) = input.try(|i| specified::LengthOrPercentage::parse_quirky(context, i, AllowQuirks::Yes)) {
|
|
||||||
return Ok(SpecifiedValue::LengthOrPercentage(lop));
|
|
||||||
}
|
|
||||||
|
|
||||||
try_match_ident_ignore_ascii_case! { input.expect_ident()?,
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
"${keyword}" => Ok(SpecifiedValue::${to_rust_ident(keyword)}),
|
|
||||||
% endfor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The computed value for `vertical-align`.
|
|
||||||
pub mod computed_value {
|
|
||||||
use std::fmt;
|
|
||||||
use style_traits::ToCss;
|
|
||||||
use values::computed;
|
|
||||||
|
|
||||||
/// The keywords are the same, and the `LengthOrPercentage` is computed
|
|
||||||
/// here.
|
|
||||||
#[allow(non_camel_case_types)]
|
|
||||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
|
||||||
#[derive(Animate, Clone, ComputeSquaredDistance, Copy, Debug, PartialEq)]
|
|
||||||
pub enum T {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
#[animation(error)] // only animatable as a length
|
|
||||||
${to_rust_ident(keyword)},
|
|
||||||
% endfor
|
|
||||||
LengthOrPercentage(computed::LengthOrPercentage),
|
|
||||||
}
|
|
||||||
impl ToCss for T {
|
|
||||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
|
||||||
match *self {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
T::${to_rust_ident(keyword)} => dest.write_str("${keyword}"),
|
|
||||||
% endfor
|
|
||||||
T::LengthOrPercentage(ref value) => value.to_css(dest),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The initial computed value for `vertical-align`.
|
|
||||||
#[inline]
|
|
||||||
pub fn get_initial_value() -> computed_value::T {
|
|
||||||
computed_value::T::baseline
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToComputedValue for SpecifiedValue {
|
|
||||||
type ComputedValue = computed_value::T;
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn to_computed_value(&self, context: &Context) -> computed_value::T {
|
|
||||||
match *self {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
SpecifiedValue::${to_rust_ident(keyword)} => {
|
|
||||||
computed_value::T::${to_rust_ident(keyword)}
|
|
||||||
}
|
|
||||||
% endfor
|
|
||||||
SpecifiedValue::LengthOrPercentage(ref value) =>
|
|
||||||
computed_value::T::LengthOrPercentage(value.to_computed_value(context)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
fn from_computed_value(computed: &computed_value::T) -> Self {
|
|
||||||
match *computed {
|
|
||||||
% for keyword in vertical_align_keywords:
|
|
||||||
computed_value::T::${to_rust_ident(keyword)} => {
|
|
||||||
SpecifiedValue::${to_rust_ident(keyword)}
|
|
||||||
}
|
|
||||||
% endfor
|
|
||||||
computed_value::T::LengthOrPercentage(value) =>
|
|
||||||
SpecifiedValue::LengthOrPercentage(
|
|
||||||
ToComputedValue::from_computed_value(&value)
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</%helpers:longhand>
|
|
||||||
|
|
||||||
|
${helpers.predefined_type(
|
||||||
|
"vertical-align",
|
||||||
|
"VerticalAlign",
|
||||||
|
"computed::VerticalAlign::baseline()",
|
||||||
|
animation_value_type="ComputedValue",
|
||||||
|
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
|
||||||
|
spec="https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align",
|
||||||
|
)}
|
||||||
|
|
||||||
// CSS 2.1, Section 11 - Visual effects
|
// CSS 2.1, Section 11 - Visual effects
|
||||||
|
|
||||||
|
|
11
components/style/values/computed/box.rs
Normal file
11
components/style/values/computed/box.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
//! Computed types for box properties.
|
||||||
|
|
||||||
|
use values::computed::length::LengthOrPercentage;
|
||||||
|
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
||||||
|
|
||||||
|
/// A computed value for the `vertical-align` property.
|
||||||
|
pub type VerticalAlign = GenericVerticalAlign<LengthOrPercentage>;
|
|
@ -34,6 +34,7 @@ pub use self::angle::Angle;
|
||||||
pub use self::background::BackgroundSize;
|
pub use self::background::BackgroundSize;
|
||||||
pub use self::border::{BorderImageSlice, BorderImageWidth, BorderImageSideWidth};
|
pub use self::border::{BorderImageSlice, BorderImageWidth, BorderImageSideWidth};
|
||||||
pub use self::border::{BorderRadius, BorderCornerRadius};
|
pub use self::border::{BorderRadius, BorderCornerRadius};
|
||||||
|
pub use self::box_::VerticalAlign;
|
||||||
pub use self::color::{Color, RGBAColor};
|
pub use self::color::{Color, RGBAColor};
|
||||||
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
||||||
pub use self::flex::FlexBasis;
|
pub use self::flex::FlexBasis;
|
||||||
|
@ -60,6 +61,8 @@ pub mod angle;
|
||||||
pub mod background;
|
pub mod background;
|
||||||
pub mod basic_shape;
|
pub mod basic_shape;
|
||||||
pub mod border;
|
pub mod border;
|
||||||
|
#[path = "box.rs"]
|
||||||
|
pub mod box_;
|
||||||
pub mod color;
|
pub mod color;
|
||||||
pub mod effects;
|
pub mod effects;
|
||||||
pub mod flex;
|
pub mod flex;
|
||||||
|
|
49
components/style/values/generics/box.rs
Normal file
49
components/style/values/generics/box.rs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
//! Generic types for box properties.
|
||||||
|
|
||||||
|
use values::animated::ToAnimatedZero;
|
||||||
|
|
||||||
|
/// A generic value for the `vertical-align` property.
|
||||||
|
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
||||||
|
#[derive(Animate, Clone, ComputeSquaredDistance, Copy, Debug, PartialEq)]
|
||||||
|
#[derive(ToComputedValue, ToCss)]
|
||||||
|
pub enum VerticalAlign<LengthOrPercentage> {
|
||||||
|
/// `baseline`
|
||||||
|
Baseline,
|
||||||
|
/// `sub`
|
||||||
|
Sub,
|
||||||
|
/// `super`
|
||||||
|
Super,
|
||||||
|
/// `top`
|
||||||
|
Top,
|
||||||
|
/// `text-top`
|
||||||
|
TextTop,
|
||||||
|
/// `middle`
|
||||||
|
Middle,
|
||||||
|
/// `bottom`
|
||||||
|
Bottom,
|
||||||
|
/// `text-bottom`
|
||||||
|
TextBottom,
|
||||||
|
/// `-moz-middle-with-baseline`
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
|
MozMiddleWithBaseline,
|
||||||
|
/// `<length-percentage>`
|
||||||
|
Length(LengthOrPercentage),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> VerticalAlign<L> {
|
||||||
|
/// Returns `baseline`.
|
||||||
|
#[inline]
|
||||||
|
pub fn baseline() -> Self {
|
||||||
|
VerticalAlign::Baseline
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> ToAnimatedZero for VerticalAlign<L> {
|
||||||
|
fn to_animated_zero(&self) -> Result<Self, ()> {
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,8 @@ use super::CustomIdent;
|
||||||
pub mod background;
|
pub mod background;
|
||||||
pub mod basic_shape;
|
pub mod basic_shape;
|
||||||
pub mod border;
|
pub mod border;
|
||||||
|
#[path = "box.rs"]
|
||||||
|
pub mod box_;
|
||||||
pub mod effects;
|
pub mod effects;
|
||||||
pub mod flex;
|
pub mod flex;
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
|
|
41
components/style/values/specified/box.rs
Normal file
41
components/style/values/specified/box.rs
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
//! Specified types for box properties.
|
||||||
|
|
||||||
|
use cssparser::Parser;
|
||||||
|
use parser::{Parse, ParserContext};
|
||||||
|
use style_traits::ParseError;
|
||||||
|
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
||||||
|
use values::specified::AllowQuirks;
|
||||||
|
use values::specified::length::LengthOrPercentage;
|
||||||
|
|
||||||
|
/// A specified value for the `vertical-align` property.
|
||||||
|
pub type VerticalAlign = GenericVerticalAlign<LengthOrPercentage>;
|
||||||
|
|
||||||
|
impl Parse for VerticalAlign {
|
||||||
|
fn parse<'i, 't>(
|
||||||
|
context: &ParserContext,
|
||||||
|
input: &mut Parser<'i, 't>,
|
||||||
|
) -> Result<Self, ParseError<'i>> {
|
||||||
|
if let Ok(lop) = input.try(|i| LengthOrPercentage::parse_quirky(context, i, AllowQuirks::Yes)) {
|
||||||
|
return Ok(GenericVerticalAlign::Length(lop));
|
||||||
|
}
|
||||||
|
|
||||||
|
try_match_ident_ignore_ascii_case! { input.expect_ident()?,
|
||||||
|
"baseline" => Ok(GenericVerticalAlign::Baseline),
|
||||||
|
"sub" => Ok(GenericVerticalAlign::Sub),
|
||||||
|
"super" => Ok(GenericVerticalAlign::Super),
|
||||||
|
"top" => Ok(GenericVerticalAlign::Top),
|
||||||
|
"text-top" => Ok(GenericVerticalAlign::TextTop),
|
||||||
|
"middle" => Ok(GenericVerticalAlign::Middle),
|
||||||
|
"bottom" => Ok(GenericVerticalAlign::Bottom),
|
||||||
|
"text-bottom" => Ok(GenericVerticalAlign::TextBottom),
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
|
"-moz-middle-with-baseline" => {
|
||||||
|
Ok(GenericVerticalAlign::MozMiddleWithBaseline)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,6 +31,7 @@ pub use self::align::{AlignItems, AlignJustifyContent, AlignJustifySelf, Justify
|
||||||
pub use self::background::BackgroundSize;
|
pub use self::background::BackgroundSize;
|
||||||
pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth};
|
pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth};
|
||||||
pub use self::border::{BorderImageSideWidth, BorderRadius, BorderSideWidth};
|
pub use self::border::{BorderImageSideWidth, BorderRadius, BorderSideWidth};
|
||||||
|
pub use self::box_::VerticalAlign;
|
||||||
pub use self::color::{Color, RGBAColor};
|
pub use self::color::{Color, RGBAColor};
|
||||||
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
||||||
pub use self::flex::FlexBasis;
|
pub use self::flex::FlexBasis;
|
||||||
|
@ -60,6 +61,8 @@ pub mod angle;
|
||||||
pub mod background;
|
pub mod background;
|
||||||
pub mod basic_shape;
|
pub mod basic_shape;
|
||||||
pub mod border;
|
pub mod border;
|
||||||
|
#[path = "box.rs"]
|
||||||
|
pub mod box_;
|
||||||
pub mod calc;
|
pub mod calc;
|
||||||
pub mod color;
|
pub mod color;
|
||||||
pub mod effects;
|
pub mod effects;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue