Use more WebRender types in gfx/display_list

This uses floating-point (Layout) coordinates in where possible.
Replace NormalBorder struct with WebRender equivalent.
Remove ToPointF and ToRectF traits.
Convert border RepeatKeyword with ToLayout.
Add some definitions to malloc_size_of for WebRender types.
This commit is contained in:
Pyfisch 2018-01-12 21:24:23 +01:00
parent 8612a87ed2
commit 8c7c5f6e79
10 changed files with 181 additions and 240 deletions

View file

@ -31,7 +31,7 @@ use gfx::display_list::{BorderRadii, BoxShadowDisplayItem, ClipScrollNode};
use gfx::display_list::{ClipScrollNodeIndex, ClipScrollNodeType, ClippingAndScrolling};
use gfx::display_list::{ClippingRegion, DisplayItem, DisplayItemMetadata, DisplayList};
use gfx::display_list::{DisplayListSection, GradientDisplayItem, IframeDisplayItem, ImageBorder};
use gfx::display_list::{ImageDisplayItem, LineDisplayItem, NormalBorder, OpaqueNode};
use gfx::display_list::{ImageDisplayItem, LineDisplayItem, OpaqueNode};
use gfx::display_list::{PopAllTextShadowsDisplayItem, PushTextShadowDisplayItem};
use gfx::display_list::{RadialGradientDisplayItem, SolidColorDisplayItem, StackingContext};
use gfx::display_list::{StackingContextType, StickyFrameData, TextDisplayItem, TextOrientation};
@ -56,14 +56,12 @@ use style::computed_values::background_clip::single_value::T as BackgroundClip;
use style::computed_values::background_origin::single_value::T as BackgroundOrigin;
use style::computed_values::border_style::T as BorderStyle;
use style::computed_values::cursor;
use style::computed_values::image_rendering::T as ImageRendering;
use style::computed_values::overflow_x::T as StyleOverflow;
use style::computed_values::pointer_events::T as PointerEvents;
use style::computed_values::position::T as StylePosition;
use style::computed_values::visibility::T as Visibility;
use style::logical_geometry::{LogicalMargin, LogicalPoint, LogicalRect, LogicalSize, WritingMode};
use style::properties::ComputedValues;
use style::properties::longhands::border_image_repeat::computed_value::RepeatKeyword;
use style::properties::style_structs;
use style::servo::restyle_damage::ServoRestyleDamage;
use style::values::{Either, RGBA};
@ -76,8 +74,9 @@ use style_traits::CSSPixel;
use style_traits::ToCss;
use style_traits::cursor::Cursor;
use table_cell::CollapsedBordersForCell;
use webrender_api::{BoxShadowClipMode, ClipId, ClipMode, ColorF, ComplexClipRegion, LineStyle};
use webrender_api::{LocalClip, RepeatMode, ScrollPolicy, ScrollSensitivity, StickyOffsetBounds};
use webrender_api::{self, BoxShadowClipMode, ClipId, ClipMode, ColorF, ComplexClipRegion};
use webrender_api::{ImageRendering, LayoutSize, LayoutVector2D, LineStyle};
use webrender_api::{LocalClip, NormalBorder, ScrollPolicy, ScrollSensitivity, StickyOffsetBounds};
trait ResolvePercentage {
fn resolve(&self, length: u32) -> u32;
@ -92,15 +91,6 @@ impl ResolvePercentage for NumberOrPercentage {
}
}
fn convert_repeat_mode(from: RepeatKeyword) -> RepeatMode {
match from {
RepeatKeyword::Stretch => RepeatMode::Stretch,
RepeatKeyword::Repeat => RepeatMode::Repeat,
RepeatKeyword::Round => RepeatMode::Round,
RepeatKeyword::Space => RepeatMode::Space,
}
}
fn establishes_containing_block_for_absolute(
flags: StackingContextCollectionFlags,
positioning: StylePosition,
@ -825,6 +815,17 @@ fn calculate_inner_bounds(mut bounds: Rect<Au>, offsets: SideOffsets2D<Au>) -> R
bounds
}
fn simple_normal_border(color: ColorF, style: webrender_api::BorderStyle) -> NormalBorder {
let side = webrender_api::BorderSide { color, style };
NormalBorder {
left: side,
right: side,
top: side,
bottom: side,
radius: webrender_api::BorderRadius::zero(),
}
}
fn calculate_inner_border_radii(
mut radii: BorderRadii<Au>,
offsets: SideOffsets2D<Au>,
@ -1129,9 +1130,9 @@ impl FragmentDisplayListBuilding for Fragment {
base: base,
webrender_image: webrender_image,
image_data: None,
stretch_size: placement.tile_size,
tile_spacing: placement.tile_spacing,
image_rendering: style.get_inheritedbox().image_rendering.clone(),
stretch_size: placement.tile_size.to_layout(),
tile_spacing: placement.tile_spacing.to_layout(),
image_rendering: style.get_inheritedbox().image_rendering.to_layout(),
})));
}
@ -1227,8 +1228,8 @@ impl FragmentDisplayListBuilding for Fragment {
DisplayItem::Gradient(Box::new(GradientDisplayItem {
base: base,
gradient: gradient,
tile: placement.tile_size,
tile_spacing: placement.tile_spacing,
tile: placement.tile_size.to_layout(),
tile_spacing: placement.tile_spacing.to_layout(),
}))
},
GradientKind::Radial(shape, center, _angle) => {
@ -1242,8 +1243,8 @@ impl FragmentDisplayListBuilding for Fragment {
DisplayItem::RadialGradient(Box::new(RadialGradientDisplayItem {
base: base,
gradient: gradient,
tile: placement.tile_size,
tile_spacing: placement.tile_spacing,
tile: placement.tile_size.to_layout(),
tile_spacing: placement.tile_spacing.to_layout(),
}))
},
};
@ -1279,18 +1280,18 @@ impl FragmentDisplayListBuilding for Fragment {
let border_radius = build_border_radius(absolute_bounds, style.get_border());
state.add_display_item(DisplayItem::BoxShadow(Box::new(BoxShadowDisplayItem {
base: base,
box_bounds: *absolute_bounds,
box_bounds: absolute_bounds.to_layout(),
color: box_shadow
.base
.color
.unwrap_or(style.get_color().color)
.to_layout(),
offset: Vector2D::new(
Au::from(box_shadow.base.horizontal),
Au::from(box_shadow.base.vertical),
offset: LayoutVector2D::new(
box_shadow.base.horizontal.px(),
box_shadow.base.vertical.px(),
),
blur_radius: Au::from(box_shadow.base.blur),
spread_radius: Au::from(box_shadow.spread),
blur_radius: box_shadow.base.blur.px(),
spread_radius: box_shadow.spread.px(),
border_radius,
clip_mode: if box_shadow.inset {
BoxShadowClipMode::Inset
@ -1373,20 +1374,31 @@ impl FragmentDisplayListBuilding for Fragment {
display_list_section,
);
let border_radius = build_border_radius(&bounds, border_style_struct);
match border_style_struct.border_image_source {
Either::First(_) => {
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
border_widths: border.to_physical(style.writing_mode),
details: BorderDetails::Normal(NormalBorder {
color: SideOffsets2D::new(
colors.top.to_layout(),
colors.right.to_layout(),
colors.bottom.to_layout(),
colors.left.to_layout(),
),
style: border_style,
radius: build_border_radius(&bounds, border_style_struct),
left: webrender_api::BorderSide {
color: colors.left.to_layout(),
style: border_style.left.to_layout(),
},
right: webrender_api::BorderSide {
color: colors.right.to_layout(),
style: border_style.right.to_layout(),
},
top: webrender_api::BorderSide {
color: colors.top.to_layout(),
style: border_style.top.to_layout(),
},
bottom: webrender_api::BorderSide {
color: colors.bottom.to_layout(),
style: border_style.bottom.to_layout(),
},
radius: border_radius.to_border_radius(),
}),
})));
},
@ -1432,6 +1444,7 @@ impl FragmentDisplayListBuilding for Fragment {
self.get_webrender_image_for_paint_worklet(state, style, paint_worklet, size);
if let Some(webrender_image) = webrender_image {
let corners = &border_style_struct.border_image_slice.offsets;
let border_image_repeat = &border_style_struct.border_image_repeat;
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
@ -1447,12 +1460,8 @@ impl FragmentDisplayListBuilding for Fragment {
),
// TODO(gw): Support border-image-outset
outset: SideOffsets2D::zero(),
repeat_horizontal: convert_repeat_mode(
border_style_struct.border_image_repeat.0,
),
repeat_vertical: convert_repeat_mode(
border_style_struct.border_image_repeat.1,
),
repeat_horizontal: border_image_repeat.0.to_layout(),
repeat_vertical: border_image_repeat.1.to_layout(),
}),
})));
}
@ -1472,6 +1481,7 @@ impl FragmentDisplayListBuilding for Fragment {
);
if let Some(webrender_image) = webrender_image {
let corners = &border_style_struct.border_image_slice.offsets;
let border_image_repeat = &border_style_struct.border_image_repeat;
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
@ -1487,12 +1497,8 @@ impl FragmentDisplayListBuilding for Fragment {
),
// TODO(gw): Support border-image-outset
outset: SideOffsets2D::zero(),
repeat_horizontal: convert_repeat_mode(
border_style_struct.border_image_repeat.0,
),
repeat_vertical: convert_repeat_mode(
border_style_struct.border_image_repeat.1,
),
repeat_horizontal: border_image_repeat.0.to_layout(),
repeat_vertical: border_image_repeat.1.to_layout(),
}),
})));
}
@ -1544,11 +1550,7 @@ impl FragmentDisplayListBuilding for Fragment {
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
border_widths: SideOffsets2D::new_all_same(width),
details: BorderDetails::Normal(NormalBorder {
color: SideOffsets2D::new_all_same(color),
style: SideOffsets2D::new_all_same(outline_style),
radius: Default::default(),
}),
details: BorderDetails::Normal(simple_normal_border(color, outline_style.to_layout())),
})));
}
@ -1575,11 +1577,10 @@ impl FragmentDisplayListBuilding for Fragment {
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
border_widths: SideOffsets2D::new_all_same(Au::from_px(1)),
details: BorderDetails::Normal(NormalBorder {
color: SideOffsets2D::new_all_same(ColorF::rgb(0, 0, 200)),
style: SideOffsets2D::new_all_same(BorderStyle::Solid),
radius: Default::default(),
}),
details: BorderDetails::Normal(simple_normal_border(
ColorF::rgb(0, 0, 200),
webrender_api::BorderStyle::Solid,
)),
})));
// Draw a rectangle representing the baselines.
@ -1623,11 +1624,10 @@ impl FragmentDisplayListBuilding for Fragment {
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
border_widths: SideOffsets2D::new_all_same(Au::from_px(1)),
details: BorderDetails::Normal(NormalBorder {
color: SideOffsets2D::new_all_same(ColorF::rgb(0, 0, 200)),
style: SideOffsets2D::new_all_same(BorderStyle::Solid),
radius: Default::default(),
}),
details: BorderDetails::Normal(simple_normal_border(
ColorF::rgb(0, 0, 200),
webrender_api::BorderStyle::Solid,
)),
})));
}
@ -1996,9 +1996,9 @@ impl FragmentDisplayListBuilding for Fragment {
base: base,
webrender_image: WebRenderImageInfo::from_image(image),
image_data: Some(Arc::new(image.bytes.clone())),
stretch_size: stacking_relative_content_box.size,
tile_spacing: Size2D::zero(),
image_rendering: self.style.get_inheritedbox().image_rendering.clone(),
stretch_size: stacking_relative_content_box.size.to_layout(),
tile_spacing: LayoutSize::zero(),
image_rendering: self.style.get_inheritedbox().image_rendering.to_layout(),
})));
}
},
@ -2037,8 +2037,8 @@ impl FragmentDisplayListBuilding for Fragment {
key: Some(image_key),
},
image_data: None,
stretch_size: stacking_relative_content_box.size,
tile_spacing: Size2D::zero(),
stretch_size: stacking_relative_content_box.size.to_layout(),
tile_spacing: LayoutSize::zero(),
image_rendering: ImageRendering::Auto,
}));
@ -2160,8 +2160,8 @@ impl FragmentDisplayListBuilding for Fragment {
state.add_display_item(DisplayItem::PushTextShadow(Box::new(
PushTextShadowDisplayItem {
base: base.clone(),
blur_radius: Au::from(shadow.blur),
offset: Vector2D::new(Au::from(shadow.horizontal), Au::from(shadow.vertical)),
blur_radius: shadow.blur.px(),
offset: LayoutVector2D::new(shadow.horizontal.px(), shadow.vertical.px()),
color: shadow
.color
.unwrap_or(self.style().get_color().color)
@ -3141,11 +3141,10 @@ impl BaseFlowDisplayListBuilding for BaseFlow {
state.add_display_item(DisplayItem::Border(Box::new(BorderDisplayItem {
base: base,
border_widths: SideOffsets2D::new_all_same(Au::from_px(2)),
details: BorderDetails::Normal(NormalBorder {
color: SideOffsets2D::new_all_same(color),
style: SideOffsets2D::new_all_same(BorderStyle::Solid),
radius: BorderRadii::all_same(Au(0)),
}),
details: BorderDetails::Normal(simple_normal_border(
color,
webrender_api::BorderStyle::Solid,
)),
})));
}
}