diff --git a/lib/squib/api/image.rb b/lib/squib/api/image.rb index 41a886d..7f68e16 100644 --- a/lib/squib/api/image.rb +++ b/lib/squib/api/image.rb @@ -1,3 +1,5 @@ +require 'squib/args/paint' +require 'squib/args/card_range' module Squib class Deck @@ -21,7 +23,14 @@ module Squib # @return [nil] Returns nil # @api public def png(opts = {}) - opts = needs(opts, [:range, :files, :x, :y, :width, :height, :alpha, :layout, :blend, :angle, :mask]) + range = Args::CardRange.new(opts[:range], deck_size: size) + paint = Args::Paint.new(custom_colors).load!(opts, expand_by: size, layout: layout) + opts = needs(opts, [:range, + :files, + :x, :y, :width, :height, + :angle, + :alpha, :blend, :mask, + :layout]) Dir.chdir(img_dir) do @progress_bar.start('Loading PNG(s)', opts[:range].size) do |bar| opts[:range].each do |i| diff --git a/lib/squib/api/shapes.rb b/lib/squib/api/shapes.rb index b4d2193..7266212 100644 --- a/lib/squib/api/shapes.rb +++ b/lib/squib/api/shapes.rb @@ -33,7 +33,7 @@ module Squib def rect(opts = {}) range = Args::CardRange.new(opts[:range], deck_size: size) box = Args::Box.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].rect(box[i], draw[i]) } end @@ -58,7 +58,7 @@ module Squib def circle(opts = {}) range = Args::CardRange.new(opts[:range], deck_size: size) coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].circle(coords[i], draw[i]) } end @@ -83,7 +83,7 @@ module Squib # @api public def ellipse(opts = {}) range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) box = Args::Box.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].ellipse(box[i], draw[i]) } end @@ -110,8 +110,8 @@ module Squib # @return [nil] intended to be void # @api public def triangle(opts = {}) - range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].triangle(coords[i], draw[i]) } end @@ -135,8 +135,8 @@ module Squib # @api public def line(opts = {}) range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) + coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].line(coords[i], draw[i]) } end @@ -160,8 +160,8 @@ module Squib # @return [nil] intended to be void # @api public def curve(opts = {}) - range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].curve(coords[i], draw[i]) } end @@ -185,10 +185,10 @@ module Squib # @return [nil] intended to be void # @api public def star(opts = {}) - range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].star(coords[i], trans[i], draw[i]) } end @@ -211,10 +211,10 @@ module Squib # @return [nil] intended to be void # @api public def polygon(opts = {}) - range = Args::CardRange.new(opts[:range], deck_size: size) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) range.each { |i| @cards[i].polygon(coords[i], trans[i], draw[i]) } end diff --git a/lib/squib/api/text.rb b/lib/squib/api/text.rb index 9092f67..9bf5be8 100644 --- a/lib/squib/api/text.rb +++ b/lib/squib/api/text.rb @@ -53,7 +53,7 @@ module Squib para = Args::Paragraph.new(font).load!(opts, expand_by: size, layout: layout) box = Args::Box.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi) trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi) embed = TextEmbed.new yield(embed) if block_given? #store the opts for later use extents = Array.new(@cards.size) diff --git a/lib/squib/args/draw.rb b/lib/squib/args/draw.rb index 500ae84..15013ef 100644 --- a/lib/squib/args/draw.rb +++ b/lib/squib/args/draw.rb @@ -10,9 +10,9 @@ module Squib include ArgLoader include ColorValidator - def initialize(custom_colors = {}) + def initialize(custom_colors) @custom_colors = custom_colors - end + end def self.parameters { color: :black, diff --git a/lib/squib/args/paint.rb b/lib/squib/args/paint.rb new file mode 100644 index 0000000..ce4b26b --- /dev/null +++ b/lib/squib/args/paint.rb @@ -0,0 +1,44 @@ +require 'cairo' +require 'squib/args/arg_loader' +require 'squib/args/color_validator' + +module Squib + # @api private + module Args + class Paint + include ArgLoader + include ColorValidator + + def self.parameters + { alpha: 1.0, + blend: :none, + mask: nil, + } + end + + + def self.expanding_parameters + parameters.keys # all of them are expandable + end + + def self.params_with_units + [] + end + + def initialize(custom_colors) + @custom_colors = custom_colors + end + + def validate_alpha(arg, _i) + raise 'alpha must respond to to_f' unless arg.respond_to? :to_f + arg.to_f + end + + def validate_mask(arg, _i) + colorify(arg, @custom_colors) + end + + + end + end +end \ No newline at end of file diff --git a/spec/args/paint_spec.rb b/spec/args/paint_spec.rb new file mode 100644 index 0000000..15e98dc --- /dev/null +++ b/spec/args/paint_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' +require 'squib/args/paint' + +describe Squib::Args::Draw do + let(:custom_colors) { {'foo' => 'abc'} } + subject(:paint) {Squib::Args::Paint.new(custom_colors)} + + context 'alpha' do + + it 'can be a float' do + args = {alpha: 0.6} + paint.load!(args) + expect(paint.alpha).to eq [0.6] + end + + it 'raises exception when not a float' do + args = {alpha: /6/} + expect { paint.load!(args) }.to raise_error('alpha must respond to to_f') + end + + end +end \ No newline at end of file