acbaker 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0da3aebf60075ce0d77dbcdda8353ef87d099dd
4
- data.tar.gz: d545f2520a8bb8ff17ac7ea78be66a0a32252d60
3
+ metadata.gz: 7d47f4083dd69b97d8e22b739639fd13d85a833f
4
+ data.tar.gz: 40cc181909e9ebcd6fbdf24bff73d3b2e5e4cfae
5
5
  SHA512:
6
- metadata.gz: a7b744fbf7d7b0728bbd9a0f5f3521f9c588f35110a0b7d480d9491deb94b876ff2463e4fe9e9a7a51e85121f071bbeffc433e7f2f352e156bd1637766cb4cf5
7
- data.tar.gz: 7ab1d19be2e6bf202b417b72edd40e041ee479b105f9de7beefe0779598bc85e37b438ff1f0fa14e58dcf051fb55a7071df903dafbf9191ed36abea3f3490842
6
+ metadata.gz: 9c7e66e084a2085e49e00fbfffe567f7149bf7130a232b7129f5c234e7ab4530fb124e0047024ed3f8b80294ee40b240e0e231f36b5af27e538d6604fa538734
7
+ data.tar.gz: 9f2edbc654a1effbe76f73b9e80e6b04c710a4303440d5a88a9e688d23ade03028ae4bfaa01f36f94008c9b0cbec58db92e950fda793dbeef88a140ae0c68905
data/README.md CHANGED
@@ -20,6 +20,10 @@ USAGE
20
20
  CHANGELOG
21
21
  ---------
22
22
 
23
+ * **0.0.6**
24
+ * Implemented processors (advanced image manipulations)
25
+ * Added "center" strategy (align image in center with relative or absolute width constraints)
26
+
23
27
  * **0.0.5**
24
28
  * Add dynamic sizing option
25
29
 
data/acbaker.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.required_rubygems_version = '>= 1.3.6'
17
17
  s.add_dependency "commander", '~> 4.1'
18
18
  s.add_dependency 'json', '~> 1.8'
19
- s.add_dependency 'rmagick', '~> 2.13'
19
+ s.add_dependency 'rmagick', '~> 2.13', '>= 2.13.4'
20
20
  s.add_development_dependency "rake", '~> 10.0'
21
21
  s.files = `git ls-files`.split("\n")
22
22
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
@@ -3,10 +3,11 @@ require 'rmagick'
3
3
 
4
4
  module Acbaker
5
5
  class AssetPack
6
- attr_reader :type, :images
6
+ attr_reader :type, :images, :processors
7
7
 
8
8
  def initialize(type, options={})
9
9
  @type = type
10
+ @processors = []
10
11
  if options[:json]
11
12
  @json_data = options[:json]
12
13
  else
@@ -18,7 +19,7 @@ module Acbaker
18
19
  end
19
20
 
20
21
  def defaults
21
- {json: false, gravity: 'Center', strategy: 'cover'}
22
+ {json: false, gravity: 'Center', strategy: 'Cover'}
22
23
  end
23
24
 
24
25
  def process(source_image_file, target_directory, &block)
@@ -26,6 +27,15 @@ module Acbaker
26
27
  # Define variables
27
28
  json_output_file = File.join(target_directory, "Contents.json")
28
29
 
30
+ # Get processors
31
+ if @json_data['processors'] and @json_data['processors'].length
32
+ @json_data['processors'].each do |processor_spec|
33
+ @processors.push(Object.const_get(processor_spec['type']).new(self, processor_spec['config']))
34
+ end
35
+ else
36
+ @processors = [Object.const_get("Acbaker::Processors::#{@options[:strategy]}").new(self)]
37
+ end
38
+
29
39
  # Loop through images
30
40
  @json_data['images'].each_with_index.map do |image_spec, index|
31
41
 
@@ -86,16 +96,11 @@ module Acbaker
86
96
  end
87
97
 
88
98
  # Generate image
89
- if image_size_present
90
- if @options[:strategy] == 'contain'
91
- cmd = "convert #{source_image_file} -resize #{width}x -size #{width}x#{height} xc:#FFFFFF +swap -gravity #{@options[:gravity]} -composite #{target_directory}/#{filename}"
92
- else
93
- cmd = "convert #{source_image_file} -resize #{width}x#{height}^ -gravity #{@options[:gravity]} -crop #{width}x#{height}+0+0 +repage #{target_directory}/#{filename}"
94
- end
95
- else
96
- cmd = "convert #{source_image_file} -gravity #{@options[:gravity]} +repage #{target_directory}/#{filename}"
99
+ image = Magick::ImageList.new(source_image_file)
100
+ @processors.each do |processor|
101
+ image = processor.run(image, image_spec, width, height)
97
102
  end
98
- system(cmd)
103
+ image.write("#{target_directory}/#{filename}")
99
104
 
100
105
  # Trigger Callback proc
101
106
  block.call("#{target_directory}/#{filename}", index+1) if not block.nil?
@@ -106,6 +111,7 @@ module Acbaker
106
111
  end
107
112
 
108
113
  # Save Contents.json
114
+ @json_data.delete('processors')
109
115
  File.open(json_output_file,"w") do |f|
110
116
  f.write(JSON.pretty_generate(@json_data))
111
117
  end
@@ -5,7 +5,7 @@ command :'pack' do |c|
5
5
  c.option '--type STRING', String, 'Specify asset pack type'
6
6
  c.option '--json STRING', String, 'Specify custom json file path'
7
7
  c.option '--gravity STRING', String, 'Specify gravity (NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast)'
8
- c.option '--strategy STRING', String, 'Specify strategy (cover, contain)'
8
+ c.option '--strategy STRING', String, 'Specify strategy (Cover, Contain, Center)'
9
9
  c.option '--force', String, 'Delete and recreate output directory (careful!)'
10
10
  global_option '--force'
11
11
 
@@ -87,6 +87,14 @@ command :'pack' do |c|
87
87
  }[token]
88
88
  end
89
89
 
90
+ # Fill json
91
+ if @type and not @json
92
+ if File.file?("lib/acbaker/config/#{@type}.json")
93
+ @json = "lib/acbaker/config/#{@type}.json"
94
+ end
95
+ end
96
+
97
+ abort "error: no JSON configuration found" if not @json
90
98
  abort("error: Could not detect asset type.") if not @type
91
99
  end
92
100
 
@@ -99,9 +107,15 @@ command :'pack' do |c|
99
107
 
100
108
  def validate_strategy!
101
109
  if not @strategy
102
- @strategy = "cover"
110
+ @strategy = "Cover"
111
+ end
112
+
113
+ # try to instantiate strategy class
114
+ begin
115
+ Object.const_get("Acbaker::Processors::#{@strategy}")
116
+ rescue Exception => e
117
+ abort("error: Invalid strategy specified.")
103
118
  end
104
- abort("error: Invalid strategy specified.") if not ["cover", "contain"].include?(@strategy)
105
119
  end
106
120
 
107
121
 
@@ -0,0 +1,18 @@
1
+ module Acbaker
2
+ module Processors
3
+ class Base
4
+ attr_accessor :asset_pack, :options
5
+ @@defaults = {}
6
+
7
+ def initialize(asset_pack, options={})
8
+ @asset_pack = asset_pack
9
+ @options = options ? @@defaults.merge(options) : @@defaults
10
+ end
11
+
12
+ def run(image, image_spec, width=nil, height=nil)
13
+ throw "Acbaker::Processors::Base should be extended"
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,42 @@
1
+ module Acbaker
2
+ module Processors
3
+ class Center < Base
4
+ @@defaults = {"max-width" => "50%", "background-color" => "#FFFFFF", "gravity" => "Center"}
5
+
6
+ def run(image, image_spec, width=nil, height=nil)
7
+ transform_width = width.to_f
8
+ transform_height = height.to_f
9
+ target_ratio = transform_width / transform_height
10
+ image_ratio = image.columns / image.rows
11
+
12
+ # calculate dimensions
13
+ if @options['max-width']
14
+ if @options['max-width'][-1] == "%"
15
+ rel_width = (@options['max-width'][0..-2].to_f / 100)
16
+ transform_width = transform_width * rel_width
17
+ else
18
+ transform_width = @options['max-width'].to_f
19
+ end
20
+ transform_height = transform_width * image_ratio
21
+ end
22
+
23
+ # resize image
24
+ image.resize!(transform_width.to_i, transform_height.to_i)
25
+
26
+ # create canvas
27
+ canvas = Magick::Image.new(width, height)
28
+ if @options['background-color'] == :transparent
29
+ canvas = canvas.matte_floodfill(1, 1)
30
+ else
31
+ canvas = canvas.color_floodfill(1, 1, Magick::Pixel.from_color(@options['background-color']))
32
+ end
33
+
34
+ # place image
35
+ image = canvas.composite(image, Magick::CenterGravity, Magick::OverCompositeOp)
36
+
37
+ image
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,30 @@
1
+ module Acbaker
2
+ module Processors
3
+ class Contain < Base
4
+ @@defaults = {"background-color" => "#FFFFFF", "gravity" => "Center"}
5
+
6
+ def run(image, image_spec, width=nil, height=nil)
7
+ # resize image
8
+ image.change_geometry("#{width}x") do |px, py, i|
9
+ image.resize!(px, py)
10
+ end
11
+
12
+ # crop image
13
+ canvas = Magick::Image.new(width, height)
14
+ if @options['background-color'] == :transparent
15
+ canvas = canvas.matte_floodfill(1, 1)
16
+ else
17
+ canvas = canvas.color_floodfill(1, 1, Magick::Pixel.from_color(@options['background-color']))
18
+ end
19
+
20
+ # place image
21
+ gravity_string = "Magick::#{@options['gravity']}Gravity"
22
+ gravity = Object.const_get(gravity_string)
23
+ image = canvas.composite(image, gravity, Magick::OverCompositeOp)
24
+
25
+ image
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ module Acbaker
2
+ module Processors
3
+ class Cover < Base
4
+ @@defaults = {"background-color" => "#FFFFFF", "gravity" => "Center"}
5
+
6
+ def run(image, image_spec, width=nil, height=nil)
7
+ # resize image
8
+ image.change_geometry("#{width}x#{height}^") do |px, py, i|
9
+ image.resize!(px, py)
10
+ end
11
+
12
+ # crop image
13
+ canvas = Magick::Image.new(width, height)
14
+ if @options['background-color'] == :transparent
15
+ canvas = canvas.matte_floodfill(1, 1)
16
+ else
17
+ canvas = canvas.color_floodfill(1, 1, Magick::Pixel.from_color(@options['background-color']))
18
+ end
19
+
20
+ # place image
21
+ gravity_string = "Magick::#{@options['gravity']}Gravity"
22
+ gravity = Object.const_get(gravity_string)
23
+ image = canvas.composite(image, gravity, Magick::OverCompositeOp)
24
+
25
+ image
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ $:.push File.expand_path('../', __FILE__)
2
+ require 'processors/base'
3
+ require 'processors/center'
4
+ require 'processors/cover'
5
+ require 'processors/contain'
@@ -1,3 +1,3 @@
1
1
  module Acbaker
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/acbaker.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "acbaker/version"
2
2
  require 'acbaker/asset_pack'
3
+ require 'acbaker/processors'
3
4
 
4
5
  module Acbaker
5
6
 
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acbaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Strebitzer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-10 00:00:00.000000000 Z
11
+ date: 2015-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
@@ -45,6 +45,9 @@ dependencies:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '2.13'
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: 2.13.4
48
51
  type: :runtime
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -52,6 +55,9 @@ dependencies:
52
55
  - - ~>
53
56
  - !ruby/object:Gem::Version
54
57
  version: '2.13'
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: 2.13.4
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: rake
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -85,6 +91,11 @@ files:
85
91
  - lib/acbaker/commands/pack.rb
86
92
  - lib/acbaker/config/AppIcon.json
87
93
  - lib/acbaker/config/LaunchImage.json
94
+ - lib/acbaker/processors.rb
95
+ - lib/acbaker/processors/base.rb
96
+ - lib/acbaker/processors/center.rb
97
+ - lib/acbaker/processors/contain.rb
98
+ - lib/acbaker/processors/cover.rb
88
99
  - lib/acbaker/version.rb
89
100
  - test/assets/AppIcon.png
90
101
  - test/assets/LaunchImage.png