sprite-factory 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+