|
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
|