Skip to content

Commit

Permalink
Duplicate first gradient stop if necessary.
Browse files Browse the repository at this point in the history
If the first stop of a non-repeating gradient is
not placed at offset 0.0 it is duplicated at this
position. This solves the problem of the first
stop being ignored if it is placed at the same
offset as the next stop.
  • Loading branch information
pyfisch committed May 6, 2017
1 parent 4f17b17 commit 72db8d8
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions components/layout/display_list_builder.rs
Expand Up @@ -650,8 +650,8 @@ fn convert_gradient_stops(gradient_items: &[GradientItem],
}

// Step 3: Evenly space stops without position.
// Note: Remove the + 1 if fix_gradient_stops is changed.
let mut stops = Vec::with_capacity(stop_items.len() + 1);
// Note: Remove the + 2 if fix_gradient_stops is changed.
let mut stops = Vec::with_capacity(stop_items.len() + 2);
let mut stop_run = None;
for (i, stop) in stop_items.iter().enumerate() {
let offset = match stop.position {
Expand Down Expand Up @@ -698,15 +698,25 @@ fn convert_gradient_stops(gradient_items: &[GradientItem],
}

#[inline]
/// Duplicate the last stop if its position is smaller 100%.
/// Duplicate the first and last stops if necessary.
///
/// Explanation by pyfisch:
/// If the last stop is at the same position as the previous stop the
/// last color is ignored by webrender. This differs from the spec
/// (I think so). The implementations of Chrome and Firefox seem
/// to have the same problem but work fine if the position of the last
/// stop is smaller than 100%. (Otherwise they ignore the last stop.)
///
/// Similarly the first stop is duplicated if it is not placed
/// at the start of the virtual gradient ray.
fn fix_gradient_stops(stops: &mut Vec<GradientStop>) {
if stops.first().unwrap().offset > 0.0 {
let color = stops.first().unwrap().color;
stops.insert(0, GradientStop {
offset: 0.0,
color: color,
})
}
if stops.last().unwrap().offset < 1.0 {
let color = stops.last().unwrap().color;
stops.push(GradientStop {
Expand Down

0 comments on commit 72db8d8

Please sign in to comment.