sprite-factory 1.4.2 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ *~
1
2
  *.gem
2
3
  .bundle
3
4
  Gemfile.lock
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Sprite Factory (v1.4.2)
1
+ Sprite Factory (v1.5.0)
2
2
  =======================
3
3
 
4
4
  The sprite factory is a ruby library that can be used to generate
@@ -13,6 +13,7 @@ The library provides:
13
13
  * support for multiple layout algorithms - horizontal, vertical or [packed](http://codeincomplete.com/posts/2011/5/7/bin_packing/)
14
14
  * support for any stylesheet syntax, including [CSS](http://www.w3.org/Style/CSS/) and [Sass](http://sass-lang.com/).
15
15
  * support for any image library, including [RMagick](http://rmagick.rubyforge.org/) and [ChunkyPNG](https://github.com/wvanbergen/chunky_png).
16
+ * support for any css selector style, including :hover pseudo-class selectors
16
17
  * support for pngcrush'n the generated image file
17
18
  * compatible with Rails 3.1 asset pipeline
18
19
 
@@ -92,6 +93,7 @@ Much of the behavior can be customized by overriding the following options:
92
93
  - `:output_style` - specify output location for generated stylesheet (default: <input folder>.<style>)
93
94
  - `:pngcrush` - pngcrush the generated output image (if pngcrush is available)
94
95
  - `:padding` - add padding to each sprite
96
+ - `:margin` - add margin to each sprite
95
97
  - `:width` - fix width of each sprite to a specific size
96
98
  - `:height` - fix height of each sprite to a specific size
97
99
  - `:nocss` - suppress generation of output stylesheet (`run!` returns css content as a string instead)
@@ -109,7 +111,13 @@ You can see the results of many of these options by viewing the sample page that
109
111
  comes with the gem in `test/images/reference/index.html`.
110
112
 
111
113
  >> NOTE: only the common options are available via the command line script (to keep it simple). Specifically,
112
- the advanced `width`, `height`, `padding` and `nocss` options are only available via the Ruby interface.
114
+ the advanced `width`, `height`, `padding`, `margin` and `nocss` options are only available via the Ruby interface.
115
+
116
+ >> NOTE: the `width`, `height` and `padding` options are not particularly useful - you would be better off just
117
+ making your source images have the correct dimensions by editing them appropriately in photoshop (or your editor of choice)
118
+
119
+ >> NOTE: the `margin` option is used primarily to buffer each image in the generated sprite with > 1px margin to
120
+ avoid images bleeding into each other when the browser needs to scale them (e.g. when user increases/decreases font size).
113
121
 
114
122
  Layout
115
123
  ======
@@ -129,7 +137,17 @@ Customizing the CSS Selector
129
137
 
130
138
  By default, the CSS generated is fairly simple. It assumes you will be using `<img>`
131
139
  elements for your sprites, and that the basename of each individual file is suitable for
132
- use as a CSS classname. For example:
140
+ use as a CSS classname. For example, the following files:
141
+
142
+ images/icons/high.png
143
+ images/icons/medium.png
144
+ images/icons/low.png
145
+
146
+ ... when run with:
147
+
148
+ SpriteFactory.run!('images/icons')
149
+
150
+ ... will generate the following css:
133
151
 
134
152
  img.high { width: 16px; height: 16px; background: url(images/icons.png) 0px 0px no-repeat; }
135
153
  img.medium { width: 16px; height: 16px; background: url(images/icons.png) -16px 0px no-repeat; }
@@ -140,12 +158,47 @@ example:
140
158
 
141
159
  SpriteFactory.run!('images/icons', :selector => 'span.icon_')
142
160
 
143
- will generate:
161
+ ... will generate:
144
162
 
145
163
  span.icon_high { width: 16px; height: 16px; background: url(images/icons.png) 0px 0px no-repeat; }
146
164
  span.icon_medium { width: 16px; height: 16px; background: url(images/icons.png) -16px 0px no-repeat; }
147
165
  span.icon_low { width: 16px; height: 16px; background: url(images/icons.png) -32px 0px no-repeat; }
148
166
 
167
+ Customizing the CSS Selector Per Image
168
+ ======================================
169
+
170
+ If you want to specify a custom selector for each individual image, then name the image files
171
+ accordingly - the library will map '\_\_' (double underscore) to a single space ' ' in any source
172
+ image filename. For example:
173
+
174
+ images/icons/div.foo__span.icon_alert.png
175
+ images/icons/div.bar__span.icon_alert.png
176
+
177
+ ... when run with:
178
+
179
+ SpriteFactory.run!('images/icons', :selector => 'div.example ')
180
+
181
+ ... will generate:
182
+
183
+ div.example div.foo span.icon_alert { ... first file ... }
184
+ div.example div.bar span.icon_alert { ... second file ... }
185
+
186
+
187
+ If you want to specify a psuedo class such as `:hover` for some of your images, the library will also
188
+ map '--' (double dash) to a colon ':' in any source image filename. For example:
189
+
190
+ images/icons/alert.png
191
+ images/icons/alert--hover.png
192
+
193
+ ... when run with:
194
+
195
+ SpriteFactory.run!('images/icons', :selector => 'span.icon_')
196
+
197
+ ... will generate:
198
+
199
+ span.icon_alert { ... first file ... }
200
+ span.icon_alert:hover { ... second file ... }
201
+
149
202
  Customizing the CSS Image Path
150
203
  ==============================
151
204
 
@@ -210,7 +263,7 @@ value is a hash of image metadata that includes the following:
210
263
  * `:width` - the image width
211
264
  * `:height` - the image height
212
265
 
213
- (*NOTE*: the image coords can differ form the css sprite coords when padding or fixed width/height options are specified)
266
+ (*NOTE*: the image coords can differ form the css sprite coords when padding/margin or fixed width/height options are specified)
214
267
 
215
268
  Using sprite-factory with the Rails 3.1 asset pipeline
216
269
  ======================================================
@@ -1,6 +1,13 @@
1
-
2
- UNRELEASED - v1.4.2
3
- -------------------
1
+ May 10th 2012 - v1.5.0
2
+ ----------------------
3
+ * @halida added a new `margin` option to (optionally) separate images in generated spritesheet to avoid 'bleeding' when browser scales the sprite (e.g. when user increases text size)
4
+ * added `padding` support for `packed` layout
5
+ * added `margin` support for `packed` layout
6
+ * added support for using source image filename as automatic css selector [issue #12](https://github.com/jakesgordon/sprite-factory/issues/12)
7
+ * added support for `:hover` (and other pseudo-class) selectors [issue #14](https://github.com/jakesgordon/sprite-factory/issues/14)
8
+
9
+ February 29th 2012 - v1.4.2
10
+ ---------------------------
4
11
  * added support for `:nocomments => true` to suppress comments in generated output stylesheet
5
12
  * added support for images in subfolders - fixes [github issue #11](https://github.com/jakesgordon/sprite-factory/issues/11)
6
13
 
data/Rakefile CHANGED
@@ -31,19 +31,23 @@ task :reference do
31
31
  regenerate.call('test/images/regular')
32
32
  regenerate.call('test/images/regular', :output => 'test/images/regular.horizontal', :selector => 'img.horizontal_', :layout => :horizontal)
33
33
  regenerate.call('test/images/regular', :output => 'test/images/regular.vertical', :selector => 'img.vertical_', :layout => :vertical)
34
- regenerate.call('test/images/regular', :output => 'test/images/regular.packed', :selector => 'img.packed_', :layout => :packed)
34
+ regenerate.call('test/images/regular', :output => 'test/images/regular.packed', :selector => 'img.packed_', :layout => :packed, :padding => 10, :margin => 10)
35
35
  regenerate.call('test/images/regular', :output => 'test/images/regular.padded', :selector => 'img.padded_', :padding => 10)
36
+ regenerate.call('test/images/regular', :output => 'test/images/regular.margin', :selector => 'img.margin_', :margin => 10)
36
37
  regenerate.call('test/images/regular', :output => 'test/images/regular.fixed', :selector => 'img.fixed_', :width => 100, :height => 100)
37
38
  regenerate.call('test/images/regular', :output => 'test/images/regular.sassy', :selector => 'img.sassy_', :style => :sass)
38
39
 
39
40
  regenerate.call('test/images/irregular')
40
41
  regenerate.call('test/images/irregular', :output => 'test/images/irregular.horizontal', :selector => 'img.horizontal_', :layout => :horizontal)
41
42
  regenerate.call('test/images/irregular', :output => 'test/images/irregular.vertical', :selector => 'img.vertical_', :layout => :vertical)
42
- regenerate.call('test/images/irregular', :output => 'test/images/irregular.packed', :selector => 'img.packed_', :layout => :packed)
43
+ regenerate.call('test/images/irregular', :output => 'test/images/irregular.packed', :selector => 'img.packed_', :layout => :packed, :padding => 10, :margin => 10)
43
44
  regenerate.call('test/images/irregular', :output => 'test/images/irregular.padded', :selector => 'img.padded_', :padding => 10)
45
+ regenerate.call('test/images/irregular', :output => 'test/images/irregular.margin', :selector => 'img.margin_', :margin => 10)
44
46
  regenerate.call('test/images/irregular', :output => 'test/images/irregular.fixed', :selector => 'img.fixed_', :width => 100, :height => 100)
45
47
  regenerate.call('test/images/irregular', :output => 'test/images/irregular.sassy', :selector => 'img.sassy_', :style => :sass)
46
48
 
49
+ regenerate.call('test/images/hover', :output => 'test/images/hover', :selector => 'div.hover ', :style => :css)
50
+
47
51
  regenerate.call('test/images/custom', :output => 'test/images/custom') do |images|
48
52
  rules = []
49
53
  rules << "div.running img.button { cursor: pointer; #{images[:running][:style]} }"
@@ -2,7 +2,7 @@ module SpriteFactory
2
2
 
3
3
  #----------------------------------------------------------------------------
4
4
 
5
- VERSION = "1.4.2"
5
+ VERSION = "1.5.0"
6
6
  SUMMARY = "Automatic CSS sprite generator"
7
7
  DESCRIPTION = "Combines individual images from a directory into a single sprite image file and creates an appropriate CSS stylesheet"
8
8
  LIB = File.dirname(__FILE__)
@@ -7,7 +7,9 @@ module SpriteFactory
7
7
  height = options[:height]
8
8
  hpadding = options[:hpadding] || 0
9
9
  vpadding = options[:vpadding] || 0
10
- max_height = height || ((2 * vpadding) + images.map{|i| i[:height]}.max)
10
+ hmargin = options[:hmargin] || 0
11
+ vmargin = options[:vmargin] || 0
12
+ max_height = height || (2 *(vpadding + vmargin) + images.map{|i| i[:height]}.max)
11
13
  x = 0
12
14
  images.each do |i|
13
15
 
@@ -17,8 +19,8 @@ module SpriteFactory
17
19
  i[:x] = x + (width - i[:width]) / 2
18
20
  else
19
21
  i[:cssw] = i[:width] + (2 * hpadding) # image width plus padding
20
- i[:cssx] = x # anchored at x
21
- i[:x] = i[:cssx] + hpadding # image drawn offset to account for padding
22
+ i[:cssx] = x + hmargin # anchored at x
23
+ i[:x] = i[:cssx] + hpadding # image drawn offset to account for padding
22
24
  end
23
25
 
24
26
  if height
@@ -31,7 +33,7 @@ module SpriteFactory
31
33
  i[:y] = i[:cssy] + vpadding # image drawn offset to account for padding
32
34
  end
33
35
 
34
- x = x + i[:cssw]
36
+ x += i[:cssw] + 2 * hmargin
35
37
 
36
38
  end
37
39
  { :width => x, :height => max_height }
@@ -6,27 +6,36 @@ module SpriteFactory
6
6
 
7
7
  def self.layout(images, options = {})
8
8
 
9
- raise NotImplementedError, ":packed layout does not support the :padding option" if (options[:padding].to_i > 0) || (options[:hpadding].to_i > 0) || (options[:vpadding].to_i > 0)
10
9
  raise NotImplementedError, ":packed layout does not support fixed :width/:height option" if options[:width] || options[:height]
11
10
 
12
11
  return { :width => 0, :height => 0 } if images.empty?
13
12
 
13
+ hpadding = options[:hpadding] || 0
14
+ vpadding = options[:vpadding] || 0
15
+ hmargin = options[:hmargin] || 0
16
+ vmargin = options[:vmargin] || 0
17
+
18
+ images.each do |i|
19
+ i[:w] = i[:width] + (2*hpadding) + (2*hmargin)
20
+ i[:h] = i[:height] + (2*vpadding) + (2*vmargin)
21
+ end
22
+
14
23
  images.sort! do |a,b|
15
- diff = [b[:width], b[:height]].max <=> [a[:width], a[:height]].max
16
- diff = [b[:width], b[:height]].min <=> [a[:width], a[:height]].min if diff.zero?
17
- diff = b[:height] <=> a[:height] if diff.zero?
18
- diff = b[:width] <=> a[:width] if diff.zero?
24
+ diff = [b[:w], b[:h]].max <=> [a[:w], a[:h]].max
25
+ diff = [b[:w], b[:h]].min <=> [a[:w], a[:h]].min if diff.zero?
26
+ diff = b[:h] <=> a[:h] if diff.zero?
27
+ diff = b[:w] <=> a[:w] if diff.zero?
19
28
  diff
20
29
  end
21
30
 
22
- root = { :x => 0, :y => 0, :w => images[0][:width], :h => images[0][:height] }
31
+ root = { :x => 0, :y => 0, :w => images[0][:w], :h => images[0][:h] }
23
32
 
24
33
  images.each do |i|
25
- if (node = findNode(root, i[:width], i[:height]))
26
- placeImage(i, node)
27
- splitNode(node, i[:width], i[:height])
34
+ if (node = findNode(root, i[:w], i[:h]))
35
+ placeImage(i, node, hpadding, vpadding, hmargin, vmargin)
36
+ splitNode(node, i[:w], i[:h])
28
37
  else
29
- root = grow(root, i[:width], i[:height])
38
+ root = grow(root, i[:w], i[:h])
30
39
  redo
31
40
  end
32
41
  end
@@ -35,11 +44,13 @@ module SpriteFactory
35
44
 
36
45
  end
37
46
 
38
- def self.placeImage(image, node)
39
- image[:cssx] = image[:x] = node[:x] # TODO
40
- image[:cssy] = image[:y] = node[:y] # * support for :padding option
41
- image[:cssw] = image[:width] # * support for fixed :width/:height option
42
- image[:cssh] = image[:height]
47
+ def self.placeImage(image, node, hpadding, vpadding, hmargin, vmargin)
48
+ image[:cssx] = node[:x] + hmargin
49
+ image[:cssy] = node[:y] + vmargin
50
+ image[:cssw] = image[:width] + (2*hpadding)
51
+ image[:cssh] = image[:height] + (2*vpadding)
52
+ image[:x] = image[:cssx] + hpadding
53
+ image[:y] = image[:cssy] + vpadding
43
54
  end
44
55
 
45
56
  def self.findNode(root, w, h)
@@ -7,7 +7,9 @@ module SpriteFactory
7
7
  height = options[:height]
8
8
  hpadding = options[:hpadding] || 0
9
9
  vpadding = options[:vpadding] || 0
10
- max_width = width || ((2 * hpadding) + images.map{|i| i[:width]}.max)
10
+ hmargin = options[:hmargin] || 0
11
+ vmargin = options[:vmargin] || 0
12
+ max_width = width || (2 * (hpadding + hmargin) + images.map{|i| i[:width]}.max)
11
13
  y = 0
12
14
  images.each do |i|
13
15
 
@@ -26,12 +28,12 @@ module SpriteFactory
26
28
  i[:cssy] = y
27
29
  i[:y] = y + (height - i[:height]) / 2
28
30
  else
29
- i[:cssh] = i[:height] + (2 * vpadding) # image height plus padding
30
- i[:cssy] = y # anchored at y
31
- i[:y] = i[:cssy] + vpadding # image drawn offset to account for padding
31
+ i[:cssh] = i[:height] + (2 * vpadding) # image height plus padding
32
+ i[:cssy] = y + vmargin # anchored at y
33
+ i[:y] = i[:cssy] + vpadding # image drawn offset to account for padding
32
34
  end
33
35
 
34
- y = y + i[:cssh]
36
+ y += i[:cssh] + 2 * vmargin
35
37
 
36
38
  end
37
39
  { :width => max_width, :height => y }
@@ -38,6 +38,8 @@ module SpriteFactory
38
38
 
39
39
  raise RuntimeError, "set :width for fixed width, or :hpadding for horizontal padding, but not both." if width && !hpadding.zero?
40
40
  raise RuntimeError, "set :height for fixed height, or :vpadding for vertical padding, but not both." if height && !vpadding.zero?
41
+ raise RuntimeError, "set :width for fixed width, or :hmargin for horizontal margin, but not both." if width && !hmargin.zero?
42
+ raise RuntimeError, "set :height for fixed height, or :vmargin for vertical margin, but not both." if height && !hmargin.zero?
41
43
 
42
44
  images = load_images
43
45
  max = layout_images(images)
@@ -91,6 +93,14 @@ module SpriteFactory
91
93
  config[:vpadding] || config[:padding] || 0
92
94
  end
93
95
 
96
+ def hmargin
97
+ config[:hmargin] || config[:margin] || 0
98
+ end
99
+
100
+ def vmargin
101
+ config[:vmargin] || config[:margin] || 0
102
+ end
103
+
94
104
  def width
95
105
  config[:width]
96
106
  end
@@ -156,16 +166,22 @@ module SpriteFactory
156
166
  input_path = Pathname.new(input)
157
167
  images = library.load(image_files)
158
168
  images.each do |i|
159
- i[:name] = Pathname.new(i[:filename]).relative_path_from(input_path).to_s.gsub(File::SEPARATOR, "_")
160
- i[:ext] = File.extname(i[:name])
161
- i[:name] = i[:name][0...-i[:ext].length] unless i[:ext].empty?
162
-
169
+ i[:name], i[:ext] = map_image_filename(i[:filename], input_path)
163
170
  raise RuntimeError, "image #{i[:name]} does not fit within a fixed width of #{width}" if width && (width < i[:width])
164
171
  raise RuntimeError, "image #{i[:name]} does not fit within a fixed height of #{height}" if height && (height < i[:height])
165
172
  end
166
173
  images
167
174
  end
168
175
 
176
+ def map_image_filename(filename, input_path)
177
+ name = Pathname.new(filename).relative_path_from(input_path).to_s.gsub(File::SEPARATOR, "_")
178
+ name = name.gsub('--', ':')
179
+ name = name.gsub('__', ' ')
180
+ ext = File.extname(name)
181
+ name = name[0...-ext.length] unless ext.empty?
182
+ [name, ext]
183
+ end
184
+
169
185
  def create_sprite(images, width, height)
170
186
  library.create(output_image_file, images, width, height)
171
187
  pngcrush(output_image_file)
@@ -178,7 +194,7 @@ module SpriteFactory
178
194
  end
179
195
 
180
196
  def layout_images(images)
181
- layout_strategy.layout(images, :width => width, :height => height, :hpadding => hpadding, :vpadding => vpadding)
197
+ layout_strategy.layout(images, :width => width, :height => height, :hpadding => hpadding, :vpadding => vpadding, :hmargin => hmargin, :vmargin => vmargin)
182
198
  end
183
199
 
184
200
  #----------------------------------------------------------------------------
@@ -0,0 +1,22 @@
1
+ /*
2
+
3
+ Creating a sprite from following images:
4
+
5
+ test/images/hover/div.bar__img.icon--hover.png (18x18)
6
+ test/images/hover/div.bar__img.icon.png (18x18)
7
+ test/images/hover/div.foo__img.icon--hover.png (18x18)
8
+ test/images/hover/div.foo__img.icon.png (18x18)
9
+
10
+ Output files:
11
+ test/images/hover.png
12
+ test/images/hover.css
13
+
14
+ Output size:
15
+ 72x18
16
+
17
+
18
+ */
19
+ div.hover div.bar img.icon:hover { width: 18px; height: 18px; background: url(hover.png) 0px 0px no-repeat; }
20
+ div.hover div.bar img.icon { width: 18px; height: 18px; background: url(hover.png) -18px 0px no-repeat; }
21
+ div.hover div.foo img.icon:hover { width: 18px; height: 18px; background: url(hover.png) -36px 0px no-repeat; }
22
+ div.hover div.foo img.icon { width: 18px; height: 18px; background: url(hover.png) -54px 0px no-repeat; }
@@ -8,6 +8,7 @@
8
8
  <link href='regular.vertical.css' rel='stylesheet' type='text/css' media='screen'></link>
9
9
  <link href='regular.packed.css' rel='stylesheet' type='text/css' media='screen'></link>
10
10
  <link href='regular.padded.css' rel='stylesheet' type='text/css' media='screen'></link>
11
+ <link href='regular.margin.css' rel='stylesheet' type='text/css' media='screen'></link>
11
12
  <link href='regular.fixed.css' rel='stylesheet' type='text/css' media='screen'></link>
12
13
  <link href='regular.sassy.css' rel='stylesheet' type='text/css' media='screen'></link>
13
14
  <link href='irregular.css' rel='stylesheet' type='text/css' media='screen'></link>
@@ -15,11 +16,13 @@
15
16
  <link href='irregular.vertical.css' rel='stylesheet' type='text/css' media='screen'></link>
16
17
  <link href='irregular.packed.css' rel='stylesheet' type='text/css' media='screen'></link>
17
18
  <link href='irregular.padded.css' rel='stylesheet' type='text/css' media='screen'></link>
19
+ <link href='irregular.margin.css' rel='stylesheet' type='text/css' media='screen'></link>
18
20
  <link href='irregular.fixed.css' rel='stylesheet' type='text/css' media='screen'></link>
19
21
  <link href='irregular.sassy.css' rel='stylesheet' type='text/css' media='screen'></link>
20
22
  <link href='custom.css' rel='stylesheet' type='text/css' media='screen'></link>
21
23
  <link href='formats.css' rel='stylesheet' type='text/css' media='screen'></link>
22
24
  <link href='subfolders.css' rel='stylesheet' type='text/css' media='screen'></link>
25
+ <link href='hover.css' rel='stylesheet' type='text/css' media='screen'></link>
23
26
  <style>
24
27
  img { border: 1px solid red; }
25
28
  </style>
@@ -47,7 +50,7 @@
47
50
  <img src='s.gif' class='vertical_regular4'><br>
48
51
  <img src='s.gif' class='vertical_regular5'><br>
49
52
 
50
- <h1>Regular (packed)</h1>
53
+ <h1>Regular (packed with padding and margin)</h1>
51
54
  <img src='s.gif' class='packed_regular1'>
52
55
  <img src='s.gif' class='packed_regular2'>
53
56
  <img src='s.gif' class='packed_regular3'>
@@ -61,6 +64,13 @@
61
64
  <img src='s.gif' class='padded_regular4'>
62
65
  <img src='s.gif' class='padded_regular5'>
63
66
 
67
+ <h1>Regular (margin)</h1>
68
+ <img src='s.gif' class='margin_regular1'>
69
+ <img src='s.gif' class='margin_regular2'>
70
+ <img src='s.gif' class='margin_regular3'>
71
+ <img src='s.gif' class='margin_regular4'>
72
+ <img src='s.gif' class='margin_regular5'>
73
+
64
74
  <h1>Regular (fixed)</h1>
65
75
  <img src='s.gif' class='fixed_regular1'>
66
76
  <img src='s.gif' class='fixed_regular2'>
@@ -96,7 +106,7 @@
96
106
  <img src='s.gif' class='vertical_irregular4'><br>
97
107
  <img src='s.gif' class='vertical_irregular5'><br>
98
108
 
99
- <h1>Irregular (packed)</h1>
109
+ <h1>Irregular (packed with padding and margin)</h1>
100
110
  <img src='s.gif' class='packed_irregular1'>
101
111
  <img src='s.gif' class='packed_irregular2'>
102
112
  <img src='s.gif' class='packed_irregular3'>
@@ -110,6 +120,13 @@
110
120
  <img src='s.gif' class='padded_irregular4'>
111
121
  <img src='s.gif' class='padded_irregular5'>
112
122
 
123
+ <h1>Irregular (margin)</h1>
124
+ <img src='s.gif' class='margin_irregular1'>
125
+ <img src='s.gif' class='margin_irregular2'>
126
+ <img src='s.gif' class='margin_irregular3'>
127
+ <img src='s.gif' class='margin_irregular4'>
128
+ <img src='s.gif' class='margin_irregular5'>
129
+
113
130
  <h1>Irregular (fixed)</h1>
114
131
  <img src='s.gif' class='fixed_irregular1'>
115
132
  <img src='s.gif' class='fixed_irregular2'>
@@ -144,6 +161,12 @@
144
161
  <img src='s.gif' class='usa_amy'>
145
162
  <img src='s.gif' class='usa_bob'>
146
163
 
164
+ <h1>With Hover State</h1>
165
+ <div class='hover'>
166
+ <div class='foo'><img src='s.gif' class='icon'></div>
167
+ <div class='bar'><img src='s.gif' class='icon'></div>
168
+ </div>
169
+
147
170
  <script>
148
171
  SpriteFactory = {
149
172
  toggleTimer: function() {
@@ -0,0 +1,24 @@
1
+ /*
2
+
3
+ Creating a sprite from following images:
4
+
5
+ test/images/irregular/irregular1.png (60x60)
6
+ test/images/irregular/irregular2.png (16x16)
7
+ test/images/irregular/irregular3.png (48x48)
8
+ test/images/irregular/irregular4.png (34x14)
9
+ test/images/irregular/irregular5.png (46x25)
10
+
11
+ Output files:
12
+ test/images/irregular.margin.png
13
+ test/images/irregular.margin.css
14
+
15
+ Output size:
16
+ 304x80
17
+
18
+
19
+ */
20
+ img.margin_irregular1 { width: 60px; height: 60px; background: url(irregular.margin.png) -10px -10px no-repeat; }
21
+ img.margin_irregular2 { width: 16px; height: 16px; background: url(irregular.margin.png) -90px -32px no-repeat; }
22
+ img.margin_irregular3 { width: 48px; height: 48px; background: url(irregular.margin.png) -126px -16px no-repeat; }
23
+ img.margin_irregular4 { width: 34px; height: 14px; background: url(irregular.margin.png) -194px -33px no-repeat; }
24
+ img.margin_irregular5 { width: 46px; height: 25px; background: url(irregular.margin.png) -248px -27px no-repeat; }
@@ -13,12 +13,12 @@
13
13
  test/images/irregular.packed.css
14
14
 
15
15
  Output size:
16
- 108x101
16
+ 244x165
17
17
 
18
18
 
19
19
  */
20
- img.packed_irregular1 { width: 60px; height: 60px; background: url(irregular.packed.png) 0px 0px no-repeat; }
21
- img.packed_irregular3 { width: 48px; height: 48px; background: url(irregular.packed.png) -60px 0px no-repeat; }
22
- img.packed_irregular5 { width: 46px; height: 25px; background: url(irregular.packed.png) 0px -60px no-repeat; }
23
- img.packed_irregular4 { width: 34px; height: 14px; background: url(irregular.packed.png) -46px -60px no-repeat; }
24
- img.packed_irregular2 { width: 16px; height: 16px; background: url(irregular.packed.png) 0px -85px no-repeat; }
20
+ img.packed_irregular1 { width: 80px; height: 80px; background: url(irregular.packed.png) -10px -10px no-repeat; }
21
+ img.packed_irregular3 { width: 68px; height: 68px; background: url(irregular.packed.png) -110px -10px no-repeat; }
22
+ img.packed_irregular5 { width: 66px; height: 45px; background: url(irregular.packed.png) -10px -110px no-repeat; }
23
+ img.packed_irregular4 { width: 54px; height: 34px; background: url(irregular.packed.png) -96px -110px no-repeat; }
24
+ img.packed_irregular2 { width: 36px; height: 36px; background: url(irregular.packed.png) -198px -10px no-repeat; }
@@ -0,0 +1,24 @@
1
+ /*
2
+
3
+ Creating a sprite from following images:
4
+
5
+ test/images/regular/regular1.PNG (64x64)
6
+ test/images/regular/regular2.PNG (64x64)
7
+ test/images/regular/regular3.PNG (64x64)
8
+ test/images/regular/regular4.PNG (64x64)
9
+ test/images/regular/regular5.PNG (64x64)
10
+
11
+ Output files:
12
+ test/images/regular.margin.png
13
+ test/images/regular.margin.css
14
+
15
+ Output size:
16
+ 420x84
17
+
18
+
19
+ */
20
+ img.margin_regular1 { width: 64px; height: 64px; background: url(regular.margin.png) -10px -10px no-repeat; }
21
+ img.margin_regular2 { width: 64px; height: 64px; background: url(regular.margin.png) -94px -10px no-repeat; }
22
+ img.margin_regular3 { width: 64px; height: 64px; background: url(regular.margin.png) -178px -10px no-repeat; }
23
+ img.margin_regular4 { width: 64px; height: 64px; background: url(regular.margin.png) -262px -10px no-repeat; }
24
+ img.margin_regular5 { width: 64px; height: 64px; background: url(regular.margin.png) -346px -10px no-repeat; }
@@ -13,12 +13,12 @@
13
13
  test/images/regular.packed.css
14
14
 
15
15
  Output size:
16
- 192x128
16
+ 312x208
17
17
 
18
18
 
19
19
  */
20
- img.packed_regular1 { width: 64px; height: 64px; background: url(regular.packed.png) 0px 0px no-repeat; }
21
- img.packed_regular2 { width: 64px; height: 64px; background: url(regular.packed.png) -64px 0px no-repeat; }
22
- img.packed_regular3 { width: 64px; height: 64px; background: url(regular.packed.png) 0px -64px no-repeat; }
23
- img.packed_regular4 { width: 64px; height: 64px; background: url(regular.packed.png) -64px -64px no-repeat; }
24
- img.packed_regular5 { width: 64px; height: 64px; background: url(regular.packed.png) -128px 0px no-repeat; }
20
+ img.packed_regular1 { width: 84px; height: 84px; background: url(regular.packed.png) -10px -10px no-repeat; }
21
+ img.packed_regular2 { width: 84px; height: 84px; background: url(regular.packed.png) -114px -10px no-repeat; }
22
+ img.packed_regular3 { width: 84px; height: 84px; background: url(regular.packed.png) -10px -114px no-repeat; }
23
+ img.packed_regular4 { width: 84px; height: 84px; background: url(regular.packed.png) -114px -114px no-repeat; }
24
+ img.packed_regular5 { width: 84px; height: 84px; background: url(regular.packed.png) -218px -10px no-repeat; }
@@ -24,7 +24,9 @@ module SpriteFactory
24
24
  def test_generate_packed_regular_sprite
25
25
  integration_test(REGULAR_PATH, :output => output_path('regular.packed'),
26
26
  :selector => 'img.packed_',
27
- :layout => :packed)
27
+ :layout => :packed,
28
+ :padding => 10,
29
+ :margin => 10)
28
30
  end
29
31
 
30
32
  def test_generate_regular_sprite_with_padding
@@ -33,6 +35,12 @@ module SpriteFactory
33
35
  :padding => 10)
34
36
  end
35
37
 
38
+ def test_generate_regular_sprite_with_margin
39
+ integration_test(REGULAR_PATH, :output => output_path('regular.margin'),
40
+ :selector => 'img.margin_',
41
+ :margin => 10)
42
+ end
43
+
36
44
  def test_generate_regular_sprite_with_fixed_size
37
45
  integration_test(REGULAR_PATH, :output => output_path('regular.fixed'),
38
46
  :selector => 'img.fixed_',
@@ -73,7 +81,9 @@ module SpriteFactory
73
81
  def test_generate_packed_irregular_sprite
74
82
  integration_test(IRREGULAR_PATH, :output => output_path('irregular.packed'),
75
83
  :selector => 'img.packed_',
76
- :layout => :packed)
84
+ :layout => :packed,
85
+ :padding => 10,
86
+ :margin => 10)
77
87
  end
78
88
 
79
89
  def test_generate_irregular_sprite_with_padding
@@ -82,6 +92,12 @@ module SpriteFactory
82
92
  :padding => 10)
83
93
  end
84
94
 
95
+ def test_generate_irregular_sprite_with_margin
96
+ integration_test(IRREGULAR_PATH, :output => output_path('irregular.margin'),
97
+ :selector => 'img.margin_',
98
+ :margin => 10)
99
+ end
100
+
85
101
  def test_generate_irregular_sprite_with_fixed_size
86
102
  integration_test(IRREGULAR_PATH, :output => output_path('irregular.fixed'),
87
103
  :selector => 'img.fixed_',
@@ -120,6 +136,12 @@ module SpriteFactory
120
136
 
121
137
  #----------------------------------------------------------------------------
122
138
 
139
+ def test_generate_sprites_with_hover_pseudo_class
140
+ integration_test(HOVER_PATH, :selector => 'div.hover ')
141
+ end
142
+
143
+ #----------------------------------------------------------------------------
144
+
123
145
  def test_generate_sprite_with_nocss
124
146
  input = REGULAR_PATH
125
147
  output = File.basename(REGULAR_PATH)
@@ -36,6 +36,34 @@ module SpriteFactory
36
36
 
37
37
  #--------------------------------------------------------------------------
38
38
 
39
+ def test_margin_horizontal_layout_of_regular_images
40
+ images = get_regular_images
41
+ expected = [
42
+ { :cssx => 10, :cssy => 20, :cssw => 20, :cssh => 10, :x => 10, :y => 20 },
43
+ { :cssx => 50, :cssy => 20, :cssw => 20, :cssh => 10, :x => 50, :y => 20 },
44
+ { :cssx => 90, :cssy => 20, :cssw => 20, :cssh => 10, :x => 90, :y => 20 },
45
+ { :cssx => 130, :cssy => 20, :cssw => 20, :cssh => 10, :x => 130, :y => 20 },
46
+ { :cssx => 170, :cssy => 20, :cssw => 20, :cssh => 10, :x => 170, :y => 20 }
47
+ ]
48
+ verify_layout(200, 50, expected, images, :layout => :horizontal, :hmargin => 10, :vmargin => 20)
49
+ end
50
+
51
+ #--------------------------------------------------------------------------
52
+
53
+ def test_padded_and_margin_horizontal_layout_of_regular_images
54
+ images = get_regular_images
55
+ expected = [
56
+ { :cssx => 10, :cssy => 20, :cssw => 24, :cssh => 18, :x => 12, :y => 24 },
57
+ { :cssx => 54, :cssy => 20, :cssw => 24, :cssh => 18, :x => 56, :y => 24 },
58
+ { :cssx => 98, :cssy => 20, :cssw => 24, :cssh => 18, :x => 100, :y => 24 },
59
+ { :cssx => 142, :cssy => 20, :cssw => 24, :cssh => 18, :x => 144, :y => 24 },
60
+ { :cssx => 186, :cssy => 20, :cssw => 24, :cssh => 18, :x => 188, :y => 24 }
61
+ ]
62
+ verify_layout(220, 58, expected, images, :layout => :horizontal, :hmargin => 10, :vmargin => 20, :hpadding => 2, :vpadding => 4)
63
+ end
64
+
65
+ #--------------------------------------------------------------------------
66
+
39
67
  def test_fixed_horizontal_layout_of_regular_images
40
68
  images = get_regular_images
41
69
  expected = [
@@ -80,6 +108,34 @@ module SpriteFactory
80
108
 
81
109
  #--------------------------------------------------------------------------
82
110
 
111
+ def test_margin_horizontal_layout_of_irregular_images
112
+ images = get_irregular_images
113
+ expected = [
114
+ { :cssx => 10, :cssy => 20, :cssw => 20, :cssh => 50, :x => 10, :y => 20 },
115
+ { :cssx => 50, :cssy => 25, :cssw => 40, :cssh => 40, :x => 50, :y => 25 },
116
+ { :cssx => 110, :cssy => 30, :cssw => 60, :cssh => 30, :x => 110, :y => 30 },
117
+ { :cssx => 190, :cssy => 35, :cssw => 80, :cssh => 20, :x => 190, :y => 35 },
118
+ { :cssx => 290, :cssy => 40, :cssw => 100, :cssh => 10, :x => 290, :y => 40 }
119
+ ]
120
+ verify_layout(400, 90, expected, images, :layout => :horizontal, :hmargin => 10, :vmargin => 20)
121
+ end
122
+
123
+ #--------------------------------------------------------------------------
124
+
125
+ def test_padded_and_margin_horizontal_layout_of_irregular_images
126
+ images = get_irregular_images
127
+ expected = [
128
+ { :cssx => 10, :cssy => 20, :cssw => 24, :cssh => 58, :x => 12, :y => 24 },
129
+ { :cssx => 54, :cssy => 25, :cssw => 44, :cssh => 48, :x => 56, :y => 29 },
130
+ { :cssx => 118, :cssy => 30, :cssw => 64, :cssh => 38, :x => 120, :y => 34 },
131
+ { :cssx => 202, :cssy => 35, :cssw => 84, :cssh => 28, :x => 204, :y => 39 },
132
+ { :cssx => 306, :cssy => 40, :cssw => 104, :cssh => 18, :x => 308, :y => 44 }
133
+ ]
134
+ verify_layout(420, 98, expected, images, :layout => :horizontal, :hmargin => 10, :vmargin => 20, :hpadding => 2, :vpadding => 4)
135
+ end
136
+
137
+ #--------------------------------------------------------------------------
138
+
83
139
  def test_fixed_horizontal_layout_of_irregular_images
84
140
  images = get_irregular_images
85
141
  expected = [
@@ -10,22 +10,48 @@ module SpriteFactory
10
10
 
11
11
  def test_packed_layout_of_regular_images
12
12
  images = get_regular_images
13
- expected = [ # expected: ---------
14
- { :x => 0, :y => 0 }, # |111|333|
15
- { :x => 0, :y => 10 }, # ---------
16
- { :x => 20, :y => 0 }, # |222|444|
17
- { :x => 20, :y => 10 }, # ---------
18
- { :x => 0, :y => 20 } # |555| |
19
- ] # ---------
13
+ expected = [ # expected: -------
14
+ { :cssx => 0, :cssy => 0, :cssw => 20, :cssh => 10, :x => 0, :y => 0 }, # |11|33|
15
+ { :cssx => 0, :cssy => 10, :cssw => 20, :cssh => 10, :x => 0, :y => 10 }, # -------
16
+ { :cssx => 20, :cssy => 0, :cssw => 20, :cssh => 10, :x => 20, :y => 0 }, # |22|44|
17
+ { :cssx => 20, :cssy => 10, :cssw => 20, :cssh => 10, :x => 20, :y => 10 }, # -------
18
+ { :cssx => 0, :cssy => 20, :cssw => 20, :cssh => 10, :x => 0, :y => 20 } # |55| |
19
+ ] # -------
20
20
  verify_layout(40, 30, expected, images, :layout => :packed)
21
21
  end
22
22
 
23
23
  #--------------------------------------------------------------------------
24
24
 
25
- def test_padded_packed_layout_of_regular_images
26
- assert_not_implemented ":packed layout does not support the :padding option" do
27
- Layout::Packed.layout(get_regular_images, :padding => 10)
28
- end
25
+ def test_padded_packed_layout_of_regular_images # expected: ---------------
26
+ # | | |
27
+ images = get_regular_images # | 11 | 33 |
28
+ expected = [ # | | |
29
+ { :cssx => 0, :cssy => 0, :cssw => 60, :cssh => 30, :x => 20, :y => 10 }, # ---------------
30
+ { :cssx => 0, :cssy => 30, :cssw => 60, :cssh => 30, :x => 20, :y => 40 }, # | | |
31
+ { :cssx => 60, :cssy => 0, :cssw => 60, :cssh => 30, :x => 80, :y => 10 }, # | 22 | 44 |
32
+ { :cssx => 60, :cssy => 30, :cssw => 60, :cssh => 30, :x => 80, :y => 40 }, # | | |
33
+ { :cssx => 0, :cssy => 60, :cssw => 60, :cssh => 30, :x => 20, :y => 70 } # ---------------
34
+ ] # | |
35
+ verify_layout(120, 90, expected, images, :layout => :packed, # | 55 |
36
+ :hpadding => 20, # | |
37
+ :vpadding => 10) # --------
38
+ end
39
+
40
+ #--------------------------------------------------------------------------
41
+
42
+ def test_margin_packed_layout_of_regular_images # expected: ---------------
43
+ # | | |
44
+ images = get_regular_images # | 11 | 33 |
45
+ expected = [ # | | |
46
+ { :cssx => 20, :cssy => 10, :cssw => 20, :cssh => 10, :x => 20, :y => 10 }, # ---------------
47
+ { :cssx => 20, :cssy => 40, :cssw => 20, :cssh => 10, :x => 20, :y => 40 }, # | | |
48
+ { :cssx => 80, :cssy => 10, :cssw => 20, :cssh => 10, :x => 80, :y => 10 }, # | 22 | 44 |
49
+ { :cssx => 80, :cssy => 40, :cssw => 20, :cssh => 10, :x => 80, :y => 40 }, # | | |
50
+ { :cssx => 20, :cssy => 70, :cssw => 20, :cssh => 10, :x => 20, :y => 70 } # ---------------
51
+ ] # | |
52
+ verify_layout(120, 90, expected, images, :layout => :packed, # | 55 |
53
+ :hmargin => 20, # | |
54
+ :vmargin => 10) # --------
29
55
  end
30
56
 
31
57
  #--------------------------------------------------------------------------
@@ -42,18 +68,54 @@ module SpriteFactory
42
68
 
43
69
  def test_packed_layout_of_irregular_images
44
70
  images = get_irregular_images
45
- # expected: -----------------
46
- expected = [ # |11111111111|444|
47
- { :x => 0, :y => 0 }, # ------------|444|
48
- { :x => 0, :y => 10 }, # |2222222| |444|
49
- { :x => 0, :y => 30 }, # ------------|444|
50
- { :x => 100, :y => 0 }, # |3333| -----
51
- { :x => 0, :y => 60 } # -----------------
52
- ] # |555| |
53
- # -----------------
71
+ # expected: ---------------
72
+ expected = [ # |1111111111|44|
73
+ { :cssx => 0, :cssy => 0, :cssw => 100, :cssh => 10, :x => 0, :y => 0 }, # -----------|44|
74
+ { :cssx => 0, :cssy => 10, :cssw => 80, :cssh => 20, :x => 0, :y => 10 }, # |22222222| |44|
75
+ { :cssx => 0, :cssy => 30, :cssw => 60, :cssh => 30, :x => 0, :y => 30 }, # -----------|44|
76
+ { :cssx => 100, :cssy => 0, :cssw => 20, :cssh => 50, :x => 100, :y => 0 }, # |333333| ----
77
+ { :cssx => 0, :cssy => 60, :cssw => 40, :cssh => 40, :x => 0, :y => 60 } # ---------------
78
+ ] # |5555| |
79
+ # ---------------
54
80
  verify_layout(120, 100, expected, images, :layout => :packed)
55
81
  end
56
82
 
83
+ #--------------------------------------------------------------------------
84
+
85
+ def test_padded_packed_layout_of_irregular_images # expected: (but with more vertical padding than shown here)
86
+ images = get_irregular_images #
87
+ # -------------------------
88
+ expected = [ # | 1111111111 | 4444 |
89
+ { :cssx => 0, :cssy => 0, :cssw => 140, :cssh => 30, :x => 20, :y => 10 }, # ---------------- 4444 |
90
+ { :cssx => 0, :cssy => 30, :cssw => 120, :cssh => 40, :x => 20, :y => 40 }, # | 22222222 | ----------
91
+ { :cssx => 0, :cssy => 70, :cssw => 100, :cssh => 50, :x => 20, :y => 80 }, # -------------- |
92
+ { :cssx => 140, :cssy => 0, :cssw => 80, :cssh => 60, :x => 160, :y => 10 }, # | 333333 | |
93
+ { :cssx => 0, :cssy => 120, :cssw => 60, :cssh => 70, :x => 20, :y => 130 } # |----------- |
94
+ ] # | 55 | |
95
+ # -------------------------
96
+ verify_layout(220, 190, expected, images, :layout => :packed, #
97
+ :hpadding => 20, #
98
+ :vpadding => 10) #
99
+ end
100
+
101
+ #--------------------------------------------------------------------------
102
+
103
+ def test_margin_packed_layout_of_irregular_images # expected: (but with more vertical margin than shown here)
104
+ images = get_irregular_images #
105
+ # -------------------------
106
+ expected = [ # | 1111111111 | 4444 |
107
+ { :cssx => 20, :cssy => 10, :cssw => 100, :cssh => 10, :x => 20, :y => 10 }, # ---------------- 4444 |
108
+ { :cssx => 20, :cssy => 40, :cssw => 80, :cssh => 20, :x => 20, :y => 40 }, # | 22222222 | ----------
109
+ { :cssx => 20, :cssy => 80, :cssw => 60, :cssh => 30, :x => 20, :y => 80 }, # -------------- |
110
+ { :cssx => 160, :cssy => 10, :cssw => 40, :cssh => 40, :x => 160, :y => 10 }, # | 333333 | |
111
+ { :cssx => 20, :cssy => 130, :cssw => 20, :cssh => 50, :x => 20, :y => 130 } # |----------- |
112
+ ] # | 55 | |
113
+ # -------------------------
114
+ verify_layout(220, 190, expected, images, :layout => :packed, #
115
+ :hmargin => 20, #
116
+ :vmargin => 10) #
117
+ end
118
+
57
119
  #==========================================================================
58
120
  # other packed algorithm test
59
121
  #==========================================================================
@@ -36,6 +36,34 @@ module SpriteFactory
36
36
 
37
37
  #--------------------------------------------------------------------------
38
38
 
39
+ def test_margin_vertical_layout_of_regular_images
40
+ images = get_regular_images
41
+ expected = [
42
+ { :cssx => 10, :cssy => 20, :cssw => 20, :cssh => 10, :x => 10, :y => 20 },
43
+ { :cssx => 10, :cssy => 70, :cssw => 20, :cssh => 10, :x => 10, :y => 70 },
44
+ { :cssx => 10, :cssy => 120, :cssw => 20, :cssh => 10, :x => 10, :y => 120 },
45
+ { :cssx => 10, :cssy => 170, :cssw => 20, :cssh => 10, :x => 10, :y => 170 },
46
+ { :cssx => 10, :cssy => 220, :cssw => 20, :cssh => 10, :x => 10, :y => 220 }
47
+ ]
48
+ verify_layout(40, 250, expected, images, :layout => :vertical, :hmargin => 10, :vmargin => 20)
49
+ end
50
+
51
+ #--------------------------------------------------------------------------
52
+
53
+ def test_padded_and_margin_vertical_layout_of_regular_images
54
+ images = get_regular_images
55
+ expected = [
56
+ { :cssx => 10, :cssy => 20, :cssw => 24, :cssh => 18, :x => 12, :y => 24 },
57
+ { :cssx => 10, :cssy => 78, :cssw => 24, :cssh => 18, :x => 12, :y => 82 },
58
+ { :cssx => 10, :cssy => 136, :cssw => 24, :cssh => 18, :x => 12, :y => 140 },
59
+ { :cssx => 10, :cssy => 194, :cssw => 24, :cssh => 18, :x => 12, :y => 198 },
60
+ { :cssx => 10, :cssy => 252, :cssw => 24, :cssh => 18, :x => 12, :y => 256 }
61
+ ]
62
+ verify_layout(44, 290, expected, images, :layout => :vertical, :hmargin => 10, :vmargin => 20, :hpadding => 2, :vpadding => 4)
63
+ end
64
+
65
+ #--------------------------------------------------------------------------
66
+
39
67
  def test_fixed_vertical_layout_of_regular_images
40
68
  images = get_regular_images
41
69
  expected = [
@@ -80,6 +108,34 @@ module SpriteFactory
80
108
 
81
109
  #--------------------------------------------------------------------------
82
110
 
111
+ def test_margin_vertical_layout_of_irregular_images
112
+ images = get_irregular_images
113
+ expected = [
114
+ { :cssx => 50, :cssy => 20, :cssw => 20, :cssh => 50, :x => 50, :y => 20 },
115
+ { :cssx => 40, :cssy => 110, :cssw => 40, :cssh => 40, :x => 40, :y => 110 },
116
+ { :cssx => 30, :cssy => 190, :cssw => 60, :cssh => 30, :x => 30, :y => 190 },
117
+ { :cssx => 20, :cssy => 260, :cssw => 80, :cssh => 20, :x => 20, :y => 260 },
118
+ { :cssx => 10, :cssy => 320, :cssw => 100, :cssh => 10, :x => 10, :y => 320 }
119
+ ]
120
+ verify_layout(120, 350, expected, images, :layout => :vertical, :hmargin => 10, :vmargin => 20)
121
+ end
122
+
123
+ #--------------------------------------------------------------------------
124
+
125
+ def test_padded_and_margin_vertical_layout_of_irregular_images
126
+ images = get_irregular_images
127
+ expected = [
128
+ { :cssx => 50, :cssy => 20, :cssw => 24, :cssh => 58, :x => 52, :y => 24 },
129
+ { :cssx => 40, :cssy => 118, :cssw => 44, :cssh => 48, :x => 42, :y => 122 },
130
+ { :cssx => 30, :cssy => 206, :cssw => 64, :cssh => 38, :x => 32, :y => 210 },
131
+ { :cssx => 20, :cssy => 284, :cssw => 84, :cssh => 28, :x => 22, :y => 288 },
132
+ { :cssx => 10, :cssy => 352, :cssw => 104, :cssh => 18, :x => 12, :y => 356 }
133
+ ]
134
+ verify_layout(124, 390, expected, images, :layout => :vertical, :hmargin => 10, :vmargin => 20, :hpadding => 2, :vpadding => 4)
135
+ end
136
+
137
+ #--------------------------------------------------------------------------
138
+
83
139
  def test_fixed_vertical_layout_of_irregular_images
84
140
  images = get_irregular_images
85
141
  expected = [
@@ -81,6 +81,22 @@ module SpriteFactory
81
81
  end
82
82
  end
83
83
 
84
+ def test_default_margin
85
+ Runner.publicize_methods do
86
+ r = Runner.new(REGULAR_PATH)
87
+ assert_equal(0, r.hmargin)
88
+ assert_equal(0, r.vmargin)
89
+
90
+ r = Runner.new(REGULAR_PATH, :margin => 10)
91
+ assert_equal(10, r.hmargin)
92
+ assert_equal(10, r.vmargin)
93
+
94
+ r = Runner.new(REGULAR_PATH, :hmargin => 10, :vmargin => 20)
95
+ assert_equal(10, r.hmargin)
96
+ assert_equal(20, r.vmargin)
97
+ end
98
+ end
99
+
84
100
  #----------------------------------------------------------------------------
85
101
 
86
102
  def test_default_css_path
@@ -150,6 +166,14 @@ module SpriteFactory
150
166
  SpriteFactory.run!(REGULAR_PATH, :height => 50, :padding => 10)
151
167
  end
152
168
 
169
+ assert_runtime_error "set :width for fixed width, or :hmargin for horizontal margin, but not both." do
170
+ SpriteFactory.run!(REGULAR_PATH, :width => 50, :margin => 10)
171
+ end
172
+
173
+ assert_runtime_error "set :height for fixed height, or :vmargin for vertical margin, but not both." do
174
+ SpriteFactory.run!(REGULAR_PATH, :height => 50, :margin => 10)
175
+ end
176
+
153
177
  assert_runtime_error "image regular1 does not fit within a fixed width of 10" do
154
178
  SpriteFactory.run!(REGULAR_PATH, :width => 10)
155
179
  end
@@ -15,6 +15,7 @@ module SpriteFactory
15
15
  FORMATS_PATH = 'test/images/formats'
16
16
  EMPTY_PATH = 'test/images/empty'
17
17
  SUBFOLDERS_PATH = 'test/images/subfolders'
18
+ HOVER_PATH = 'test/images/hover'
18
19
 
19
20
  REGULAR = SpriteFactory.find_files(File.join(REGULAR_PATH, '*.png'))
20
21
  IRREGULAR = SpriteFactory.find_files(File.join(IRREGULAR_PATH, '*.png'))
metadata CHANGED
@@ -1,48 +1,58 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sprite-factory
3
- version: !ruby/object:Gem::Version
4
- version: 1.4.2
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 5
8
+ - 0
9
+ version: 1.5.0
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - Jake Gordon
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
- date: 2012-02-29 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2012-05-10 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: rmagick
16
- requirement: &20623420 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
22
31
  type: :development
23
- prerelease: false
24
- version_requirements: *20623420
25
- - !ruby/object:Gem::Dependency
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
26
34
  name: chunky_png
27
- requirement: &20623000 !ruby/object:Gem::Requirement
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
28
37
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
33
44
  type: :development
34
- prerelease: false
35
- version_requirements: *20623000
36
- description: Combines individual images from a directory into a single sprite image
37
- file and creates an appropriate CSS stylesheet
38
- email:
45
+ version_requirements: *id002
46
+ description: Combines individual images from a directory into a single sprite image file and creates an appropriate CSS stylesheet
47
+ email:
39
48
  - jake@codeincomplete.com
40
- executables:
49
+ executables:
41
50
  - sf
42
51
  extensions: []
43
- extra_rdoc_files:
52
+
53
+ extra_rdoc_files:
44
54
  - README.md
45
- files:
55
+ files:
46
56
  - .gitignore
47
57
  - LICENSE
48
58
  - README.md
@@ -66,6 +76,10 @@ files:
66
76
  - test/images/formats/monkey.gif
67
77
  - test/images/formats/spies.jpg
68
78
  - test/images/formats/thief.png
79
+ - test/images/hover/div.bar__img.icon--hover.png
80
+ - test/images/hover/div.bar__img.icon.png
81
+ - test/images/hover/div.foo__img.icon--hover.png
82
+ - test/images/hover/div.foo__img.icon.png
69
83
  - test/images/irregular/irregular1.png
70
84
  - test/images/irregular/irregular2.png
71
85
  - test/images/irregular/irregular3.png
@@ -76,12 +90,16 @@ files:
76
90
  - test/images/reference/custom.png
77
91
  - test/images/reference/formats.css
78
92
  - test/images/reference/formats.png
93
+ - test/images/reference/hover.css
94
+ - test/images/reference/hover.png
79
95
  - test/images/reference/index.html
80
96
  - test/images/reference/irregular.css
81
97
  - test/images/reference/irregular.fixed.css
82
98
  - test/images/reference/irregular.fixed.png
83
99
  - test/images/reference/irregular.horizontal.css
84
100
  - test/images/reference/irregular.horizontal.png
101
+ - test/images/reference/irregular.margin.css
102
+ - test/images/reference/irregular.margin.png
85
103
  - test/images/reference/irregular.packed.css
86
104
  - test/images/reference/irregular.packed.png
87
105
  - test/images/reference/irregular.padded.css
@@ -99,6 +117,8 @@ files:
99
117
  - test/images/reference/regular.fixed.png
100
118
  - test/images/reference/regular.horizontal.css
101
119
  - test/images/reference/regular.horizontal.png
120
+ - test/images/reference/regular.margin.css
121
+ - test/images/reference/regular.margin.png
102
122
  - test/images/reference/regular.nocomments.css
103
123
  - test/images/reference/regular.nocomments.png
104
124
  - test/images/reference/regular.packed.css
@@ -133,29 +153,37 @@ files:
133
153
  - test/runner_test.rb
134
154
  - test/style_test.rb
135
155
  - test/test_case.rb
156
+ has_rdoc: true
136
157
  homepage: https://github.com/jakesgordon/sprite-factory
137
158
  licenses: []
159
+
138
160
  post_install_message:
139
- rdoc_options:
161
+ rdoc_options:
140
162
  - --charset=UTF-8
141
- require_paths:
163
+ require_paths:
142
164
  - lib
143
- required_ruby_version: !ruby/object:Gem::Requirement
165
+ required_ruby_version: !ruby/object:Gem::Requirement
144
166
  none: false
145
- requirements:
146
- - - ! '>='
147
- - !ruby/object:Gem::Version
148
- version: '0'
149
- required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ segments:
171
+ - 0
172
+ version: "0"
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
174
  none: false
151
- requirements:
152
- - - ! '>='
153
- - !ruby/object:Gem::Version
154
- version: '0'
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ segments:
179
+ - 0
180
+ version: "0"
155
181
  requirements: []
182
+
156
183
  rubyforge_project:
157
- rubygems_version: 1.8.7
184
+ rubygems_version: 1.3.7
158
185
  signing_key:
159
186
  specification_version: 3
160
187
  summary: Automatic CSS sprite generator
161
188
  test_files: []
189
+