class Fastlane::Helper::VersionIconHelper

Constants

CACHE_FILE_NAME
CONTENTS_JSON_FILE_NAME

Public Class Methods

get_versioned_path(path, suffix) click to toggle source
# File lib/fastlane/plugin/icon_versioning/helper/version_icon_helper.rb, line 85
def self.get_versioned_path(path, suffix)
  return path.gsub(/([^.]+)(\.appiconset)/, "\\1-#{suffix}\\2")
end
new(params) click to toggle source
# File lib/fastlane/plugin/icon_versioning/helper/version_icon_helper.rb, line 16
def initialize(params)
  @appiconset_path = File.expand_path(params[:appiconset_path])
  @versioned_appiconset_suffix = params[:versioned_appiconset_suffix]
  @text = params[:text]
  @text_color = params[:text_color]

  text_margins_percentages = params[:text_margins_percentages]

  text_margins_percentages *= 4 if text_margins_percentages.length == 1
  text_margins_percentages *= 2 if text_margins_percentages.length == 2

  @text_top_margin_percentage = text_margins_percentages[0]
  @text_right_margin_percentage = text_margins_percentages[1]
  @text_bottom_margin_percentage = text_margins_percentages[2]
  @text_left_margin_percentage = text_margins_percentages[3]

  @band_height_percentage = params[:band_height_percentage]
  @band_blur_radius_percentage = params[:band_blur_radius_percentage]
  @band_blur_sigma_percentage = params[:band_blur_sigma_percentage]

  @ignored_icons_regex = params[:ignored_icons_regex]
end

Public Instance Methods

run() click to toggle source
# File lib/fastlane/plugin/icon_versioning/helper/version_icon_helper.rb, line 39
def run()
  versioned_appiconset_path = self.class.get_versioned_path(@appiconset_path, @versioned_appiconset_suffix)

  Dir.mkdir(versioned_appiconset_path) unless Dir.exist?(versioned_appiconset_path)

  cache_file_path = File.join(versioned_appiconset_path, CACHE_FILE_NAME)

  if File.exist?(cache_file_path)
    cache = YAML.load_file(cache_file_path)
  else
    cache = {}
  end

  FileUtils.copy("#{@appiconset_path}/#{CONTENTS_JSON_FILE_NAME}", "#{versioned_appiconset_path}/#{CONTENTS_JSON_FILE_NAME}")

  Dir.glob("#{@appiconset_path}/*.png").each do |original_icon_path|
    versioned_icon_path = self.class.get_versioned_path(original_icon_path, @versioned_appiconset_suffix)

    text_sha = Digest::SHA2.hexdigest(@text)

    unless cache[original_icon_path].nil?
      if File.exist?(versioned_icon_path)
        versioned_icon_sha = Digest::SHA2.file(versioned_icon_path).hexdigest

        cached_text_sha = cache[original_icon_path][:text]
        cached_icon_sha = cache[original_icon_path][:icon]

        next if text_sha == cached_text_sha && versioned_icon_sha == cached_icon_sha
      end
    end

    if @ignored_icons_regex && !(original_icon_path =~ @ignored_icons_regex).nil?
      FileUtils.copy(original_icon_path, versioned_icon_path)
    else
      version_icon(original_icon_path, versioned_icon_path)
    end

    cache[original_icon_path] = {}

    cache[original_icon_path][:text] = text_sha
    cache[original_icon_path][:icon] = Digest::SHA2.file(versioned_icon_path).hexdigest
  end

  File.open(cache_file_path, 'w') { |file| file.write(cache.to_yaml) }
end

Private Instance Methods

suffix(path, text) click to toggle source
# File lib/fastlane/plugin/icon_versioning/helper/version_icon_helper.rb, line 170
def suffix(path, text)
  extension = File.extname(path)

  return path.gsub(extension, "_#{text}#{extension}")
end
version_icon(original_icon_path, versioned_icon_path) click to toggle source
# File lib/fastlane/plugin/icon_versioning/helper/version_icon_helper.rb, line 91
def version_icon(original_icon_path, versioned_icon_path)
  image = MiniMagick::Image.open(original_icon_path)

  image_width = image[:width]
  image_height = image[:height]

  band_height = image_height * @band_height_percentage
  band_blur_radius = image_width * @band_blur_radius_percentage
  band_blur_sigma = image_width * @band_blur_sigma_percentage

  band_top_position = image_height - band_height

  text_top_margin = image_height * @text_top_margin_percentage
  text_right_margin = image_width * @text_right_margin_percentage
  text_bottom_margin = image_height * @text_bottom_margin_percentage
  text_left_margin = image_width * @text_left_margin_percentage

  blurred_icon_path = suffix(versioned_icon_path, 'blurred')
  mask_icon_path = suffix(versioned_icon_path, 'mask')
  text_base_icon_path = suffix(versioned_icon_path, 'text_base')
  text_icon_path = suffix(versioned_icon_path, 'text')
  temp_icon_path = suffix(versioned_icon_path, 'temp')

  MiniMagick::Tool::Convert.new do |convert|
    convert << original_icon_path
    convert << '-blur' << "#{band_blur_radius}x#{band_blur_sigma}"
    convert << blurred_icon_path
  end

  MiniMagick::Tool::Convert.new do |convert|
    convert << blurred_icon_path
    convert << '-gamma' << '0'
    convert << '-fill' << 'white'
    convert << '-draw' << "rectangle 0, #{band_top_position}, #{image_width}, #{image_height}"
    convert << mask_icon_path
  end

  MiniMagick::Tool::Convert.new do |convert|
    convert << '-size' << "#{image_width}x#{band_height}"
    convert << 'xc:none'
    convert << '-fill' << 'rgba(0, 0, 0, 0.2)'
    convert << '-draw' << "rectangle 0, 0, #{image_width}, #{band_height}"
    convert << text_base_icon_path
  end

  MiniMagick::Tool::Convert.new do |convert|
    convert << '-background' << 'none'
    convert << '-size' << "#{image_width - (text_left_margin + text_right_margin)}x#{band_height - (text_top_margin + text_bottom_margin)}"
    convert << '-fill' << @text_color
    convert << '-gravity' << 'center'
    # using label instead of caption prevents wrapping long lines
    convert << "label:#{@text}"
    convert << text_icon_path
  end

  MiniMagick::Tool::Convert.new do |convert|
    convert << original_icon_path
    convert << blurred_icon_path
    convert << mask_icon_path
    convert << '-composite'
    convert << temp_icon_path
  end

  File.delete(blurred_icon_path, mask_icon_path)

  MiniMagick::Tool::Convert.new do |convert|
    convert << temp_icon_path
    convert << text_base_icon_path
    convert << '-geometry' << "+0+#{band_top_position}"
    convert << '-composite'
    convert << text_icon_path
    convert << '-geometry' << "+#{text_left_margin}+#{band_top_position + text_top_margin}"
    convert << '-composite'
    convert << versioned_icon_path
  end

  File.delete(text_base_icon_path, text_icon_path, temp_icon_path)
end