From fea4e3f6c58e2b1931694bbe357aa4b51b2ab941 Mon Sep 17 00:00:00 2001 From: Mattia Tommasone Date: Tue, 4 Jun 2013 17:23:50 +0200 Subject: [PATCH 1/3] rewrote changes for PR #1303 and added a test --- .../sass_extensions/sprites/image_row.rb | 6 +-- .../sass_extensions/sprites/layout/smart.rb | 4 +- .../sass_extensions/sprites/row_fitter.rb | 14 +++--- .../sprites/smart_layout_spacing_test.rb | 44 +++++++++++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 test/units/sprites/smart_layout_spacing_test.rb diff --git a/lib/compass/sass_extensions/sprites/image_row.rb b/lib/compass/sass_extensions/sprites/image_row.rb index 51ae0d7391..945e680e90 100644 --- a/lib/compass/sass_extensions/sprites/image_row.rb +++ b/lib/compass/sass_extensions/sprites/image_row.rb @@ -23,7 +23,7 @@ def add(image) alias :<< :add def height - images.map(&:height).max + images.map {|i| i.height + i.spacing}.max end def width @@ -31,7 +31,7 @@ def width end def total_width - images.inject(0) {|sum, img| sum + img.width } + images.inject(0) {|sum, img| sum + img.width + 2 * img.spacing} end def efficiency @@ -39,7 +39,7 @@ def efficiency end def will_fit?(image) - (total_width + image.width) <= max_width + (total_width + image.width + 2 * image.spacing) <= max_width end end end diff --git a/lib/compass/sass_extensions/sprites/layout/smart.rb b/lib/compass/sass_extensions/sprites/layout/smart.rb index 14bfb29b00..5c8d37f653 100644 --- a/lib/compass/sass_extensions/sprites/layout/smart.rb +++ b/lib/compass/sass_extensions/sprites/layout/smart.rb @@ -13,12 +13,14 @@ def layout! def calculate_positions! fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images) current_y = 0 + spacing = 0 fitter.fit!.each do |row| current_x = 0 row.images.each_with_index do |image, index| image.left = current_x image.top = current_y - current_x += image.width + current_x += image.width + image.spacing + spacing + spacing = image.spacing end current_y += row.height end diff --git a/lib/compass/sass_extensions/sprites/row_fitter.rb b/lib/compass/sass_extensions/sprites/row_fitter.rb index 834c57fa2f..1f7a5cc75b 100644 --- a/lib/compass/sass_extensions/sprites/row_fitter.rb +++ b/lib/compass/sass_extensions/sprites/row_fitter.rb @@ -26,11 +26,11 @@ def fit!(style = :scan) end def width - @width ||= @images.collect(&:width).max + @width ||= @images.collect(&:width).max + @images.collect(&:spacing).max end def height - @height ||= @rows.inject(0) {|sum, row| sum += row.height} + @height ||= @rows.inject(0) {|sum, row| sum += row.height} + @images[0].spacing end def efficiency @@ -38,14 +38,19 @@ def efficiency end private - def new_row(image = nil) - row = Compass::SassExtensions::Sprites::ImageRow.new(width) + def new_row(image = nil) + if image + row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * image.spacing) + else + row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * @images[0].spacing) + end row.add(image) if image row end def fast_fit row = new_row + @images.each do |image| if !row.add(image) @rows << row @@ -58,7 +63,6 @@ def fast_fit def scan_fit fast_fit - moved_images = [] begin diff --git a/test/units/sprites/smart_layout_spacing_test.rb b/test/units/sprites/smart_layout_spacing_test.rb new file mode 100644 index 0000000000..ad8827361a --- /dev/null +++ b/test/units/sprites/smart_layout_spacing_test.rb @@ -0,0 +1,44 @@ +require 'test_helper' +require 'compass/sass_extensions/sprites/layout' +require 'compass/sass_extensions/sprites/layout/smart' + +class SmartLayoutSpacingTest < Test::Unit::TestCase + include SpriteHelper + + def setup + file = StringIO.new("images_path = #{@images_src_path.inspect}\n") + Compass.add_configuration(file, "sprite_config") + end + + + def create_images_with_spacing(dims) + dims.collect { |width, height, spacing| + image = Compass::SassExtensions::Sprites::Image.new('blah', 'blah', {"spacing" => Sass::Script::Number.new(10, ['px'])}) + image.stubs(:width => width, :height => height) + image + } + end + + def spacing_dims + [ + [ 100, 10, 10 ], + [ 80, 10, 20 ], + [ 50, 10, 20 ], + [ 35, 10, 10 ], + [ 20, 10, 10 ] + ] + end + + it 'should correctly space the images according to the spacing' do + images = create_images_with_spacing(spacing_dims) + + computed_images, width, height = Compass::SassExtensions::Sprites::Layout::Smart.new(images, nil).properties + + computed_images.each do |img| + puts img.width.to_s + ": " + img.left.to_s + " " + img.top.to_s + end + + assert_equal 110, width + assert_equal 90, height + end +end \ No newline at end of file From 84c94f46ba66a0521826d7d9a037931d2793e8fc Mon Sep 17 00:00:00 2001 From: Mattia Tommasone Date: Thu, 6 Jun 2013 17:43:30 +0200 Subject: [PATCH 2/3] DRYed up --- lib/compass/sass_extensions/sprites/row_fitter.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/compass/sass_extensions/sprites/row_fitter.rb b/lib/compass/sass_extensions/sprites/row_fitter.rb index 1f7a5cc75b..a2788d4216 100644 --- a/lib/compass/sass_extensions/sprites/row_fitter.rb +++ b/lib/compass/sass_extensions/sprites/row_fitter.rb @@ -38,12 +38,10 @@ def efficiency end private - def new_row(image = nil) - if image - row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * image.spacing) - else - row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * @images[0].spacing) - end + def new_row(image = nil) + spacing = image ? image.spacing : @images[0].spacing + row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * spacing) + row.add(image) if image row end From b10ad5babcd6404ddca54844b013ab2eb6e9c5be Mon Sep 17 00:00:00 2001 From: Mattia Tommasone Date: Thu, 6 Jun 2013 17:45:53 +0200 Subject: [PATCH 3/3] fixed indenting --- test/units/sprites/smart_layout_spacing_test.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/units/sprites/smart_layout_spacing_test.rb b/test/units/sprites/smart_layout_spacing_test.rb index ad8827361a..5c5cfb4b94 100644 --- a/test/units/sprites/smart_layout_spacing_test.rb +++ b/test/units/sprites/smart_layout_spacing_test.rb @@ -30,15 +30,11 @@ def spacing_dims end it 'should correctly space the images according to the spacing' do - images = create_images_with_spacing(spacing_dims) + images = create_images_with_spacing(spacing_dims) - computed_images, width, height = Compass::SassExtensions::Sprites::Layout::Smart.new(images, nil).properties + computed_images, width, height = Compass::SassExtensions::Sprites::Layout::Smart.new(images, nil).properties - computed_images.each do |img| - puts img.width.to_s + ": " + img.left.to_s + " " + img.top.to_s - end - - assert_equal 110, width - assert_equal 90, height + assert_equal 110, width + assert_equal 90, height end end \ No newline at end of file