Split layout/background.rs file

Have background, border and gradient modules
for calculation functions.
Use shorter names for functions that are qualified
by the module name like `border::radii`.

Use push_item and push_iter to add items to WebRender.
This commit is contained in:
Pyfisch 2018-10-17 11:06:50 +02:00
parent 2304f02123
commit 2ff330a5c9
7 changed files with 577 additions and 658 deletions

View file

@ -11,7 +11,7 @@ use display_list::items::{ClipScrollNode, ClipScrollNodeIndex, ClipScrollNodeTyp
use display_list::items::{DisplayItem, DisplayList, StackingContextType};
use msg::constellation_msg::PipelineId;
use webrender_api::{self, ClipAndScrollInfo, ClipId, DisplayListBuilder, RasterSpace};
use webrender_api::LayoutPoint;
use webrender_api::{LayoutPoint, SpecificDisplayItem};
pub trait WebRenderDisplayListConverter {
fn convert_to_webrender(&self, pipeline_id: PipelineId) -> DisplayListBuilder;
@ -104,94 +104,28 @@ impl WebRenderDisplayItemConverter for DisplayItem {
match *self {
DisplayItem::Rectangle(ref item) => {
builder.push_rect(&self.prim_info(), item.item.color);
builder.push_item(SpecificDisplayItem::Rectangle(item.item), &self.prim_info());
},
DisplayItem::Text(ref item) => {
builder.push_text(
&self.prim_info(),
&item.data,
item.item.font_key,
item.item.color,
item.item.glyph_options,
);
builder.push_item(SpecificDisplayItem::Text(item.item), &self.prim_info());
builder.push_iter(item.data.iter());
},
DisplayItem::Image(ref item) => {
builder.push_image(
&self.prim_info(),
item.item.stretch_size,
item.item.tile_spacing,
item.item.image_rendering,
item.item.alpha_type,
item.item.image_key,
item.item.color,
);
builder.push_item(SpecificDisplayItem::Image(item.item), &self.prim_info());
},
DisplayItem::Border(ref item) => {
if item.data.is_empty() {
builder.push_border(&self.prim_info(), item.item.widths, item.item.details);
} else {
let mut details = item.item.details.clone();
match &mut details {
webrender_api::BorderDetails::NinePatch(
webrender_api::NinePatchBorder {
source:
webrender_api::NinePatchBorderSource::Gradient(ref mut gradient),
..
},
) => {
*gradient = builder.create_gradient(
gradient.start_point,
gradient.end_point,
item.data.clone(),
gradient.extend_mode,
);
},
webrender_api::BorderDetails::NinePatch(
webrender_api::NinePatchBorder {
source:
webrender_api::NinePatchBorderSource::RadialGradient(gradient),
..
},
) => {
*gradient = builder.create_radial_gradient(
gradient.center,
gradient.radius,
item.data.clone(),
gradient.extend_mode,
)
},
_ => unreachable!(),
}
builder.push_border(&self.prim_info(), item.item.widths, details);
if !item.data.is_empty() {
builder.push_iter(item.data.iter());
}
builder.push_item(SpecificDisplayItem::Border(item.item), &self.prim_info());
},
DisplayItem::Gradient(ref item) => {
let gradient = builder.create_gradient(
item.item.gradient.start_point,
item.item.gradient.end_point,
item.data.clone(),
item.item.gradient.extend_mode,
);
builder.push_gradient(
&self.prim_info(),
gradient,
item.item.tile_size,
item.item.tile_spacing,
);
builder.push_iter(item.data.iter());
builder.push_item(SpecificDisplayItem::Gradient(item.item), &self.prim_info());
},
DisplayItem::RadialGradient(ref item) => {
let gradient = builder.create_radial_gradient(
item.item.gradient.center,
item.item.gradient.radius,
item.data.clone(),
item.item.gradient.extend_mode,
);
builder.push_radial_gradient(
&self.prim_info(),
gradient,
item.item.tile_size,
item.item.tile_spacing,
);
builder.push_iter(item.data.iter());
builder.push_item(SpecificDisplayItem::RadialGradient(item.item), &self.prim_info());
},
DisplayItem::Line(ref item) => {
builder.push_line(
@ -204,16 +138,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
);
},
DisplayItem::BoxShadow(ref item) => {
builder.push_box_shadow(
&self.prim_info(),
item.item.box_bounds,
item.item.offset,
item.item.color,
item.item.blur_radius,
item.item.spread_radius,
item.item.border_radius,
item.item.clip_mode,
);
builder.push_item(SpecificDisplayItem::BoxShadow(item.item), &self.prim_info());
},
DisplayItem::PushTextShadow(ref item) => {
builder.push_shadow(&self.prim_info(), item.shadow);