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
56 require 'thor'56 require 'thor'
57 load 'tasks/sprites.thor'57 load 'tasks/sprites.thor'
58 58
59 SpritesCLI.new.invoke(:generate)59 SpritesCLI.new.invoke(:generate, [], :disable_optimization => true)
60 60
61 require 'active_support/per_thread_registry'61 require 'active_support/per_thread_registry'
62 require 'active_support/cache'62 require 'active_support/cache'
lib/tasks/sprites.thor+41−5
@@ -10,8 +10,9 @@ class SpritesCLI < Thor · 9 unmodified lines
10 super10 super
11 end11 end
12 12
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'
14 option :remove_public_icons, type: :boolean, desc: 'Remove public/icons after generating the spritesheets'14 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'
15 option :verbose, type: :boolean16 option :verbose, type: :boolean
16 def generate17 def generate
17 items = get_items18 items = get_items
@@ -35,8 +36,13 @@ class SpritesCLI < Thor · 17 unmodified lines
35 36
36 log_details(items_with_icons, icons_per_row)37 log_details(items_with_icons, icons_per_row)
37 38
38 generate_spritesheet(16, items_with_icons, 'assets/images/sprites/docs.png') {|item| item[:icon_16]}39 generate_spritesheet(16, items_with_icons) {|item| item[:icon_16]}
39 generate_spritesheet(32, items_with_icons, 'assets/images/sprites/docs@2x.png') {|item| item[:icon_32]}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
40 46
41 # Add Mongoose's icon details to docs without custom icons47 # Add Mongoose's icon details to docs without custom icons
42 default_item = items_with_icons.find {|item| item[:type] == 'mongoose'}48 default_item = items_with_icons.find {|item| item[:type] == 'mongoose'}
@@ -139,8 +145,10 @@ class SpritesCLI < Thor · 96 unmodified lines
139 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]145 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]
140 end146 end
141 147
142 def generate_spritesheet(size, items_with_icons, output_path, &item_to_icon)148 def generate_spritesheet(size, items_with_icons, &item_to_icon)
143 logger.info("Generating spritesheet #{output_path} with icons of size #{size} x #{size}")149 output_path = get_output_path(size)
150
151 logger.info("Generating spritesheet to #{output_path} with icons of size #{size} x #{size}")
144 152
145 icons_per_row = Math.sqrt(items_with_icons.length).ceil153 icons_per_row = Math.sqrt(items_with_icons.length).ceil
146 spritesheet = ChunkyPNG::Image.new(size * icons_per_row, size * icons_per_row)154 spritesheet = ChunkyPNG::Image.new(size * icons_per_row, size * icons_per_row)
@@ -163,6 +171,11 @@ class SpritesCLI < Thor · 16 unmodified lines
163 spritesheet.save(output_path)171 spritesheet.save(output_path)
164 end172 end
165 173
174 def optimize_spritesheet(path)
175 logger.info("Optimizing spritesheet at #{path}")
176 image_optim.optimize_image!(path)
177 end
178
166 def save_manifest(items, icons_per_row, path)179 def save_manifest(items, icons_per_row, path)
167 logger.info("Saving spritesheet details to #{path}")180 logger.info("Saving spritesheet details to #{path}")
168 181
@@ -204,6 +217,29 @@ class SpritesCLI < Thor · 35 unmodified lines
204 logger.debug(border)217 logger.debug(border)
205 end218 end
206 219
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
207 def logger243 def logger
208 @logger ||= Logger.new($stdout).tap do |logger|244 @logger ||= Logger.new($stdout).tap do |logger|
209 logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO245 logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO