123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- ICONS_DIR = 'public'
- ORIGINAL_IMAGE = 'media/huginn-icon-square.svg'
- desc "Generate site icons from #{ORIGINAL_IMAGE}"
- task :icons => 'icon:all'
- namespace :icon do
- # iOS
- task :all => :ios
- [
- 57, 114,
- 60, 120, 180,
- 72, 144,
- 76, 152,
- ].each do |width|
- sizes = '%1$dx%1$d' % width
- filename = "apple-touch-icon-#{sizes}.png"
- icon = File.join(ICONS_DIR, filename)
- file icon => ORIGINAL_IMAGE do |t|
- puts "Generating #{t.name}"
- convert_image t.source, t.name, width: width
- end
- task :ios => icon
- end
- # Android
- task :all => :android
- android_icons = [
- 36, 72, 144,
- 48, 96, 192,
- ].map do |width|
- sizes = '%1$dx%1$d' % width
- filename = "android-chrome-#{sizes}.png" % width
- icon = File.join(ICONS_DIR, filename)
- file icon => ORIGINAL_IMAGE do |t|
- puts "Generating #{t.name}"
- convert_image t.source, t.name, width: width, round: true
- end
- task :android => icon
- {
- src: "/#{filename}",
- sizes: sizes,
- type: 'image/png',
- density: (width / 48.0).to_s,
- }
- end
- manifest = File.join(ICONS_DIR, 'manifest.json')
- file manifest => __FILE__ do |t|
- puts "Generating #{t.name}"
- require 'json'
- json = {
- name: 'Huginn',
- icons: android_icons
- }
- File.write(t.name, JSON.pretty_generate(json))
- end
- task :android => manifest
- end
- require 'mini_magick'
- def convert_image(source, target, options = {}) # width: nil, round: false
- ext = target[/(?<=\.)[^.]+\z/] || 'png'
- original = MiniMagick::Image.open(source)
- result = original
- result.format ext
- if width = options[:width]
- result.thumbnail '%1$dx%1$d>' % width
- else
- width = result[:width]
- end
- if options[:round]
- radius = (Rational(80, 512) * width).round
- mask = MiniMagick::Image.create(ext) { |tmp| result.write(tmp) }
- mask.mogrify do |image|
- image.alpha 'transparent'
- image.background 'none'
- image.fill 'white'
- image.draw 'roundrectangle 0,0,%1$d,%1$d,%2$d,%2$d' % [width, radius]
- end
- result = result.composite(mask) do |image|
- image.alpha 'set'
- image.compose 'DstIn'
- end
- end
- result.strip
- result.write(target)
- end
|