Add support for background-repeat: space and round

This adds support for more background-repeat modes using the legacy
rendering backend.
This commit is contained in:
Martin Robinson 2016-09-20 11:51:51 +02:00
parent 821797d6f7
commit 68ae97fd0e
14 changed files with 193 additions and 105 deletions

View file

@ -1148,6 +1148,10 @@ pub struct ImageDisplayItem {
/// direction to tile the entire bounds.
pub stretch_size: Size2D<Au>,
/// The amount of space to add to the right and bottom part of each tile, when the image
/// is tiled.
pub tile_spacing: Size2D<Au>,
/// The algorithm we should use to stretch the image. See `image_rendering` in CSS-IMAGES-3 §
/// 5.3.
pub image_rendering: image_rendering::T,
@ -1360,6 +1364,7 @@ impl DisplayItem {
paint_context.draw_image(
&image_item.base.bounds,
&image_item.stretch_size,
&image_item.tile_spacing,
&image_item.webrender_image,
&image_item.image_data
.as_ref()

View file

@ -189,6 +189,7 @@ impl<'a> PaintContext<'a> {
pub fn draw_image(&self,
bounds: &Rect<Au>,
stretch_size: &Size2D<Au>,
tile_spacing: &Size2D<Au>,
image_info: &WebRenderImageInfo,
image_data: &[u8],
image_rendering: image_rendering::T) {
@ -229,7 +230,7 @@ impl<'a> PaintContext<'a> {
let draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
// Fast path: No need to create a pattern.
if bounds.size == *stretch_size {
if bounds.size == *stretch_size && *tile_spacing == Size2D::zero() {
draw_target_ref.draw_surface(azure_surface,
dest_rect,
source_rect,
@ -243,8 +244,8 @@ impl<'a> PaintContext<'a> {
// Annoyingly, surface patterns in Azure/Skia are relative to the top left of the *canvas*,
// not the rectangle we're drawing to. So we need to translate it explicitly.
let matrix = Matrix2D::identity().pre_translated(dest_rect.origin.x, dest_rect.origin.y);
let stretch_size = stretch_size.to_nearest_azure_size(scale);
if source_rect.size == stretch_size {
let azure_stretch_size = stretch_size.to_nearest_azure_size(scale);
if source_rect.size == azure_stretch_size && *tile_spacing == Size2D::zero() {
let pattern = SurfacePattern::new(azure_surface.azure_source_surface,
true,
true,
@ -258,10 +259,11 @@ impl<'a> PaintContext<'a> {
// Slow path: Both stretch and a pattern are needed.
let draw_surface_options = DrawSurfaceOptions::new(draw_surface_filter, true);
let draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
let temporary_target_size = (*stretch_size + *tile_spacing).to_nearest_azure_size(scale);
let temporary_draw_target =
self.draw_target.create_similar_draw_target(&stretch_size.to_azure_int_size(),
self.draw_target.create_similar_draw_target(&temporary_target_size.to_azure_int_size(),
self.draw_target.get_format());
let temporary_dest_rect = Rect::new(Point2D::new(0.0, 0.0), stretch_size);
let temporary_dest_rect = Rect::new(Point2D::new(0.0, 0.0), azure_stretch_size);
temporary_draw_target.draw_surface(azure_surface,
temporary_dest_rect,
source_rect,