mirror of
https://github.com/servo/servo.git
synced 2025-08-07 22:45:34 +01:00
layout: Implement CSS linear gradients per the CSS-IMAGES specification.
This implements the CSS `linear-gradient` property per the CSS-IMAGES specification: http://dev.w3.org/csswg/css-images-3/ Improves GitHub.
This commit is contained in:
parent
44fa9f9b18
commit
215c2a9d4c
17 changed files with 865 additions and 42 deletions
|
@ -33,6 +33,10 @@ use std::slice::Items;
|
|||
use style::computed_values::border_style;
|
||||
use sync::Arc;
|
||||
|
||||
// It seems cleaner to have layout code not mention Azure directly, so let's just reexport this for
|
||||
// layout to use.
|
||||
pub use azure::azure_hl::GradientStop;
|
||||
|
||||
pub mod optimizer;
|
||||
|
||||
/// An opaque handle to a node. The only safe operation that can be performed on this node is to
|
||||
|
@ -295,6 +299,7 @@ pub enum DisplayItem {
|
|||
TextDisplayItemClass(Box<TextDisplayItem>),
|
||||
ImageDisplayItemClass(Box<ImageDisplayItem>),
|
||||
BorderDisplayItemClass(Box<BorderDisplayItem>),
|
||||
GradientDisplayItemClass(Box<GradientDisplayItem>),
|
||||
LineDisplayItemClass(Box<LineDisplayItem>),
|
||||
|
||||
/// A pseudo-display item that exists only so that queries like `ContentBoxQuery` and
|
||||
|
@ -382,6 +387,22 @@ pub struct ImageDisplayItem {
|
|||
pub stretch_size: Size2D<Au>,
|
||||
}
|
||||
|
||||
/// Paints a gradient.
|
||||
#[deriving(Clone)]
|
||||
pub struct GradientDisplayItem {
|
||||
/// Fields common to all display items.
|
||||
pub base: BaseDisplayItem,
|
||||
|
||||
/// The start point of the gradient (computed during display list construction).
|
||||
pub start_point: Point2D<Au>,
|
||||
|
||||
/// The end point of the gradient (computed during display list construction).
|
||||
pub end_point: Point2D<Au>,
|
||||
|
||||
/// A list of color stops.
|
||||
pub stops: Vec<GradientStop>,
|
||||
}
|
||||
|
||||
/// Renders a border.
|
||||
#[deriving(Clone)]
|
||||
pub struct BorderDisplayItem {
|
||||
|
@ -482,6 +503,13 @@ impl DisplayItem {
|
|||
border.style)
|
||||
}
|
||||
|
||||
GradientDisplayItemClass(ref gradient) => {
|
||||
render_context.draw_linear_gradient(&gradient.base.bounds,
|
||||
&gradient.start_point,
|
||||
&gradient.end_point,
|
||||
gradient.stops.as_slice());
|
||||
}
|
||||
|
||||
LineDisplayItemClass(ref line) => {
|
||||
render_context.draw_line(&line.base.bounds,
|
||||
line.color,
|
||||
|
@ -498,6 +526,7 @@ impl DisplayItem {
|
|||
TextDisplayItemClass(ref text) => &text.base,
|
||||
ImageDisplayItemClass(ref image_item) => &image_item.base,
|
||||
BorderDisplayItemClass(ref border) => &border.base,
|
||||
GradientDisplayItemClass(ref gradient) => &gradient.base,
|
||||
LineDisplayItemClass(ref line) => &line.base,
|
||||
PseudoDisplayItemClass(ref base) => &**base,
|
||||
}
|
||||
|
@ -509,6 +538,7 @@ impl DisplayItem {
|
|||
TextDisplayItemClass(ref mut text) => &mut text.base,
|
||||
ImageDisplayItemClass(ref mut image_item) => &mut image_item.base,
|
||||
BorderDisplayItemClass(ref mut border) => &mut border.base,
|
||||
GradientDisplayItemClass(ref mut gradient) => &mut gradient.base,
|
||||
LineDisplayItemClass(ref mut line) => &mut line.base,
|
||||
PseudoDisplayItemClass(ref mut base) => &mut **base,
|
||||
}
|
||||
|
@ -535,6 +565,7 @@ impl fmt::Show for DisplayItem {
|
|||
TextDisplayItemClass(_) => "Text",
|
||||
ImageDisplayItemClass(_) => "Image",
|
||||
BorderDisplayItemClass(_) => "Border",
|
||||
GradientDisplayItemClass(_) => "Gradient",
|
||||
LineDisplayItemClass(_) => "Line",
|
||||
PseudoDisplayItemClass(_) => "Pseudo",
|
||||
},
|
||||
|
@ -544,3 +575,4 @@ impl fmt::Show for DisplayItem {
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue