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..a2788d4216 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 @@ -39,13 +39,16 @@ def efficiency private def new_row(image = nil) - row = Compass::SassExtensions::Sprites::ImageRow.new(width) + spacing = image ? image.spacing : @images[0].spacing + row = Compass::SassExtensions::Sprites::ImageRow.new(width + 2 * spacing) + 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 +61,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..5c5cfb4b94 --- /dev/null +++ b/test/units/sprites/smart_layout_spacing_test.rb @@ -0,0 +1,40 @@ +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 + + assert_equal 110, width + assert_equal 90, height + end +end \ No newline at end of file