History

Optimize spritesheets using OptiPNG

Jasper van Merle committed 7 years ago

Commit dc475731 parent 49a74852 files · +42 −6Browse files

Unified · Split

2 files
  1. lib/app.rb +1 −1
  2. lib/tasks/sprites.thor +41 −5
lib/app.rb+1−1
@@ -56,7 +56,7 @@ class App < Sinatra::Application · 55 unmodified lines
5656 require 'thor'
5757 load 'tasks/sprites.thor'
5858
59− SpritesCLI.new.invoke(:generate)
59+ SpritesCLI.new.invoke(:generate, [], :disable_optimization => true)
6060
6161 require 'active_support/per_thread_registry'
6262 require 'active_support/cache'
lib/tasks/sprites.thor+41−5
@@ -10,8 +10,9 @@ class SpritesCLI < Thor · 9 unmodified lines
1010 super
1111 end
1212
13− desc 'generate [--remove-public-icons] [--verbose]', 'Generate the documentation icon spritesheets'
13+ desc 'generate [--remove-public-icons] [--disable-optimization] [--verbose]', 'Generate the documentation icon spritesheets'
1414 option :remove_public_icons, type: :boolean, desc: 'Remove public/icons after generating the spritesheets'
15+ option :disable_optimization, type: :boolean, desc: 'Disable optimizing the spritesheets with OptiPNG'
1516 option :verbose, type: :boolean
1617 def generate
1718 items = get_items
@@ -35,8 +36,13 @@ class SpritesCLI < Thor · 17 unmodified lines
3536
3637 log_details(items_with_icons, icons_per_row)
3738
38− generate_spritesheet(16, items_with_icons, 'assets/images/sprites/docs.png') {|item| item[:icon_16]}
39− generate_spritesheet(32, items_with_icons, 'assets/images/sprites/docs@2x.png') {|item| item[:icon_32]}
39+ generate_spritesheet(16, items_with_icons) {|item| item[:icon_16]}
40+ generate_spritesheet(32, items_with_icons) {|item| item[:icon_32]}
41+
42+ unless options[:disable_optimization]
43+ optimize_spritesheet(get_output_path(16))
44+ optimize_spritesheet(get_output_path(32))
45+ end
4046
4147 # Add Mongoose's icon details to docs without custom icons
4248 default_item = items_with_icons.find {|item| item[:type] == 'mongoose'}
@@ -139,8 +145,10 @@ class SpritesCLI < Thor · 96 unmodified lines
139145 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]
140146 end
141147
142− def generate_spritesheet(size, items_with_icons, output_path, &item_to_icon)
143− logger.info("Generating spritesheet #{output_path} with icons of size #{size} x #{size}")
148+ def generate_spritesheet(size, items_with_icons, &item_to_icon)
149+ output_path = get_output_path(size)
150+
151+ logger.info("Generating spritesheet to #{output_path} with icons of size #{size} x #{size}")
144152
145153 icons_per_row = Math.sqrt(items_with_icons.length).ceil
146154 spritesheet = ChunkyPNG::Image.new(size * icons_per_row, size * icons_per_row)
@@ -163,6 +171,11 @@ class SpritesCLI < Thor · 16 unmodified lines
163171 spritesheet.save(output_path)
164172 end
165173
174+ def optimize_spritesheet(path)
175+ logger.info("Optimizing spritesheet at #{path}")
176+ image_optim.optimize_image!(path)
177+ end
178+
166179 def save_manifest(items, icons_per_row, path)
167180 logger.info("Saving spritesheet details to #{path}")
168181
@@ -204,6 +217,29 @@ class SpritesCLI < Thor · 35 unmodified lines
204217 logger.debug(border)
205218 end
206219
220+ def get_output_path(size)
221+ "assets/images/sprites/docs#{size == 32 ? '@2x' : ''}.png"
222+ end
223+
224+ def image_optim
225+ @image_optim ||= ImageOptim.new(
226+ :config_paths => [],
227+ :advpng => false,
228+ :gifsicle => false,
229+ :jhead => false,
230+ :jpegoptim => false,
231+ :jpegrecompress => false,
232+ :jpegtran => false,
233+ :pngcrush => false,
234+ :pngout => false,
235+ :pngquant => false,
236+ :svgo => false,
237+ :optipng => {
238+ :level => 7,
239+ },
240+ )
241+ end
242+
207243 def logger
208244 @logger ||= Logger.new($stdout).tap do |logger|
209245 logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO