diff options
author | Pyfisch <pyfisch@gmail.com> | 2017-12-27 22:15:58 +0100 |
---|---|---|
committer | Pyfisch <pyfisch@gmail.com> | 2017-12-28 20:14:31 +0100 |
commit | 3b3d4a985315e91a339fb8e448f23b16b3be1ddc (patch) | |
tree | 9139532af613e01f6a5e316e10bcd8285ae4f287 /components/layout/fragment.rs | |
parent | d96fb89c3118ff12142397f25d1546235515ec14 (diff) | |
download | servo-3b3d4a985315e91a339fb8e448f23b16b3be1ddc.tar.gz servo-3b3d4a985315e91a339fb8e448f23b16b3be1ddc.zip |
Unify background placement code
Merges the implementations for background-image placement
from gradients and images. Add missing parts and fix bugs.
Now supported are the CSS properties:
* background-attachment (except for local value)
* background-clip
* background-origin
* background-position-x/y
* background-repeat
* background-size
It should be noted that backgrounds are not clipped to
rounded border corners.
Diffstat (limited to 'components/layout/fragment.rs')
-rw-r--r-- | components/layout/fragment.rs | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index b2a627347da..77d5f714986 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -421,77 +421,6 @@ impl ImageFragmentInfo { metadata: metadata, } } - - pub fn tile_image_round(position: &mut Au, - size: &mut Au, - absolute_anchor_origin: Au, - image_size: &mut Au) { - if *size == Au(0) || *image_size == Au(0) { - *position = Au(0); - *size =Au(0); - return; - } - - let number_of_tiles = (size.to_f32_px() / image_size.to_f32_px()).round().max(1.0); - *image_size = *size / (number_of_tiles as i32); - ImageFragmentInfo::tile_image(position, size, absolute_anchor_origin, *image_size); - } - - pub fn tile_image_spaced(position: &mut Au, - size: &mut Au, - tile_spacing: &mut Au, - absolute_anchor_origin: Au, - image_size: Au) { - if *size == Au(0) || image_size == Au(0) { - *position = Au(0); - *size = Au(0); - *tile_spacing = Au(0); - return; - } - - // Per the spec, if the space available is not enough for two images, just tile as - // normal but only display a single tile. - if image_size * 2 >= *size { - ImageFragmentInfo::tile_image(position, - size, - absolute_anchor_origin, - image_size); - *tile_spacing = Au(0); - *size = image_size; - return; - } - - // Take the box size, remove room for two tiles on the edges, and then calculate how many - // other tiles fit in between them. - let size_remaining = *size - (image_size * 2); - let num_middle_tiles = (size_remaining.to_f32_px() / image_size.to_f32_px()).floor() as i32; - - // Allocate the remaining space as padding between tiles. background-position is ignored - // as per the spec, so the position is just the box origin. We are also ignoring - // background-attachment here, which seems unspecced when combined with - // background-repeat: space. - let space_for_middle_tiles = image_size * num_middle_tiles; - *tile_spacing = (size_remaining - space_for_middle_tiles) / (num_middle_tiles + 1); - } - - /// Tile an image - pub fn tile_image(position: &mut Au, - size: &mut Au, - absolute_anchor_origin: Au, - image_size: Au) { - // Avoid division by zero below! - if image_size == Au(0) { - return - } - - let delta_pixels = absolute_anchor_origin - *position; - let image_size_px = image_size.to_f32_px(); - let tile_count = ((delta_pixels.to_f32_px() + image_size_px - 1.0) / image_size_px).floor(); - let offset = image_size * (tile_count as i32); - let new_position = absolute_anchor_origin - offset; - *size = *position - new_position + *size; - *position = new_position; - } } /// A fragment that represents an inline frame (iframe). This stores the frame ID so that the |