fixed repeat-x issues closes #633"

This commit is contained in:
Scott Davis 2011-12-10 12:49:34 -05:00
parent f8377d15ac
commit 6194cb478a
10 changed files with 61 additions and 20 deletions

View File

@ -13,19 +13,7 @@ module Compass
@canvas = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
images.each do |image|
input_png = ChunkyPNG::Image.from_file(image.file)
if image.no_repeat?
canvas.replace! input_png, image.left, image.top
else
x = image.left - (image.left / image.width).ceil * image.width
while x < width do
begin
canvas.replace! input_png, x, image.top
x += image.width
rescue ChunkyPNG::OutOfBounds
break;
end
end
end
canvas.replace! input_png, image.left, image.top
end
end

View File

@ -52,9 +52,33 @@ module Compass
@width = width_for_vertical_layout
calulate_vertical_postions
@height = height_for_vertical_layout
if @images.any?(&:repeat_x?)
calculate_repeat_extra_width!
tile_images_that_repeat
end
end
end
def tile_images_that_repeat
@images.map {|img| img if img.repeat_x?}.compact.each do |image|
x = image.left - (image.left / image.width).ceil * image.width
while x < @width do
begin
img = image.dup
img.top = image.top
img.left = x.to_i
@images << img
x += image.width
end
end
end
end
def calculate_repeat_extra_width!
m = @images.inject(1) {|m,img| img.repeat_x? ? m.lcm(img.width) : m}
remainder = @width % m
@width += (m - remainder) unless remainder.zero?
end
def calculate_smart_positions
fitter = ::Compass::SassExtensions::Sprites::RowFitter.new(@images)
@ -104,7 +128,7 @@ module Compass
def calulate_vertical_postions
@images.each_with_index do |image, index|
image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value
image.left = (image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value).to_i
next if index == 0
last_image = @images[index-1]
image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -380,7 +380,7 @@ class SpritesTest < Test::Unit::TestCase
SCSS
assert_correct css, <<-CSS
.squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty {
background: url('/squares-s13833277b3.png') no-repeat;
background: url('/squares-s65c43cd573.png') no-repeat;
}
.squares-ten-by-ten {
@ -628,7 +628,7 @@ class SpritesTest < Test::Unit::TestCase
SCSS
assert_correct css, <<-CSS
.ko-sprite, .ko-default_background, .ko-starbg26x27 {
background: url('/ko-sd6b4d44430.png') no-repeat;
background: url('/ko-sd46dfbab4f.png') no-repeat;
}
.ko-default_background {

View File

@ -23,6 +23,12 @@ require 'compass'
require 'test/unit'
class String
def name
to_s
end
end
%w(command_line diff io rails test_case).each do |helper|
require "helpers/#{helper}"
end
@ -60,8 +66,9 @@ module SpriteHelper
end
def clean_up_sprites
init_sprite_helper
::FileUtils.rm_r @images_tmp_path
init_sprite_helper
::FileUtils.rm_r @images_tmp_path
rescue Errno::ENOENT => e
end
end

View File

@ -13,7 +13,7 @@ class ActionsTest < Test::Unit::TestCase
end
# When log4r is included, it sometimes breaks the Actions
def test_quiet_option
test "test_quiet_option" do
b = BaseActionExtender.new
b.logger = ""
b.options[:quiet] = true

View File

@ -1,14 +1,19 @@
require 'test_helper'
class EngineTest < Test::Unit::TestCase
include SpriteHelper
def setup
create_sprite_temp
sprite_filename = 'squares/ten-by-ten.png'
@images = [
Compass::SassExtensions::Sprites::Image.new(nil, File.join(sprite_filename), {})
]
@engine = Compass::SassExtensions::Sprites::Engine.new(100, 100, @images)
end
def taredown
clean_up_sprites
end
test "should have width of 100" do

View File

@ -3,6 +3,7 @@ require 'test_helper'
class ImageRowTest < Test::Unit::TestCase
include SpriteHelper
def setup
clean_up_sprites
create_sprite_temp
file = StringIO.new("images_path = #{@images_src_path.inspect}\n")
Compass.add_configuration(file, "sprite_config")

View File

@ -5,6 +5,7 @@ class LayoutTest < Test::Unit::TestCase
def setup
Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader)
clean_up_sprites
create_sprite_temp
file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n")
Compass.add_configuration(file, "sprite_config")
@ -50,6 +51,21 @@ class LayoutTest < Test::Unit::TestCase
sprite_map_test(opts)
end
# REPEAT_X
test 'repeat-x layout single image' do
opts = {"repeat_x_three_repeat" => Sass::Script::String.new('repeat-x')}
map = sprite_map_test(@options.merge(opts), 'repeat_x/*.png')
assert_equal 6, map.width
assert_equal [0, 4, 7, 9, 14, 4, 4], map.images.map(&:top)
end
test 'repeat-x layout multi image' do
opts = {"repeat_x_three_repeat" => Sass::Script::String.new('repeat-x'), "repeat_x_four_repeat" => Sass::Script::String.new('repeat-x')}
map = sprite_map_test(@options.merge(opts), 'repeat_x/*.png')
assert_equal 12, map.width
end
# VERTICAL LAYOUT
it "should have a vertical layout" do