diff --git a/CHANGELOG.md b/CHANGELOG.md index be76642..e8745a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Compatibility: Chores: * Refactoring to make internal drawing code more DRY (#75, and much more). This is a big re-design that will help ease future features that involve manipulating arguments. +* Better testing and general flexibility around the `range` option. ## v0.6.0 / 2015-05-26 diff --git a/lib/squib/api/shapes.rb b/lib/squib/api/shapes.rb index 7ac7904..dc3999a 100644 --- a/lib/squib/api/shapes.rb +++ b/lib/squib/api/shapes.rb @@ -1,5 +1,10 @@ require 'squib/args/box' require 'squib/args/draw' +require 'squib/args/card_range' +require 'squib/args/tri' +require 'squib/args/bezier' +require 'squib/args/polygon' +require 'squib/args/transform' module Squib class Deck @@ -28,13 +33,10 @@ module Squib # @return [nil] intended to be void # @api public def rect(opts = {}) - opts = needs(opts, [:range, :rect_radius, :x_radius, :y_radius, - :fill_color, :stroke_color, :stroke_width, :layout]) - 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) - opts[:range].each do |i| - @cards[i].rect(box[i], draw[i]) - end + 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) + range.each { |i| @cards[i].rect(box[i], draw[i]) } end # Draw a circle centered at the given coordinates @@ -51,17 +53,16 @@ module Squib # @option opts fill_color [String] ('#0000') the color with which to fill the rectangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients}. # @option opts stroke_color [String] (:black) the color with which to stroke the outside of the rectangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients}. # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def circle(opts = {}) - opts = {radius: 100}.merge(opts) # overriding the non-system default - opts = needs(opts, [:range, :x, :y, :circle_radius, :layout, - :fill_color, :stroke_color, :stroke_width]) - opts[:range].each do |i| - @cards[i].circle(opts[:x][i], opts[:y][i], opts[:radius][i], - opts[:fill_color][i], opts[:stroke_color][i], opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + opts = {radius: 100}.merge(opts) # overriding the non-system default + 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) + range.each { |i| @cards[i].circle(box[i], draw[i]) } end # Draw an ellipse @@ -79,17 +80,15 @@ module Squib # @option opts fill_color [String] ('#0000') the color with which to fill the rectangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} # @option opts stroke_color [String] (:black) the color with which to stroke the outside of the rectangle. {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def ellipse(opts = {}) - opts = needs(opts, [:range, :x, :y, :width, :height, - :fill_color, :stroke_color, :stroke_width, :layout]) - opts[:range].each do |i| - @cards[i].ellipse(opts[:x][i], opts[:y][i], opts[:width][i], opts[:height][i], - opts[:fill_color][i], opts[:stroke_color][i], - opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new.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 # Draw a triangle using the given coordinates @@ -109,19 +108,15 @@ module Squib # @option opts fill_color [String] ('#0000') the color with which to fill the triangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} # @option opts stroke_color [String] (:black) the color with which to stroke the outside of the triangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def triangle(opts = {}) - opts = needs(opts, [:range, :x1, :y1, :x2, :y2, :x3, :y3, :layout, - :fill_color, :stroke_color, :stroke_width]) - opts[:range].each do |i| - @cards[i].triangle(opts[:x1][i], opts[:y1][i], - opts[:x2][i], opts[:y2][i], - opts[:x3][i], opts[:y3][i], - opts[:fill_color][i], opts[:stroke_color][i], - opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + tri = Args::Tri.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range.each { |i| @cards[i].triangle(tri[i], draw[i]) } end # Draw a line using the given coordinates @@ -136,16 +131,16 @@ module Squib # @option opts y2 [Integer] (50) the y-coordinate to place. Supports Unit Conversion, see {file:README.md#Units Units}. # @option opts stroke_color [String] (:black) the color with which to stroke the line. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients}. # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. + # @option opts cap [String] ('butt') how the end of the line is drawn. Options are "square", "butt", and "round" + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def line(opts = {}) - opts = needs(opts, [:range, :x1, :y1, :x2, :y2, :layout, - :stroke_color, :stroke_width]) - opts[:range].each do |i| - @cards[i].line(opts[:x1][i], opts[:y1][i], opts[:x2][i], opts[:y2][i], - opts[:stroke_color][i], opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + bezier = Args::Bezier.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range.each { |i| @cards[i].line(bezier[i], draw[i]) } end # Draw a curve using the given coordinates @@ -163,18 +158,15 @@ module Squib # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. # @option opts fill_color [String] ('#0000') the color with which to fill the triangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} # @option opts cap [String] ('butt') how the end of the line is drawn. Options are "square", "butt", and "round" + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def curve(opts = {}) - opts = needs(opts, [:range, :x1, :y1, :cx1, :cy1, :x2, :y2, :cx2, :cy2, - :layout, :fill_color, :stroke_color, :stroke_width]) + range = Args::CardRange.new(opts[:range], deck_size: size) draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - opts[:range].each do |i| - @cards[i].curve(opts[:x1][i], opts[:y1][i], opts[:cx1][i], opts[:cy1][i], - opts[:x2][i], opts[:y2][i], opts[:cx2][i], opts[:cy2][i], - draw[i]) - end + bezier = Args::Bezier.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + range.each { |i| @cards[i].curve(bezier[i], draw[i]) } end # Draw a star at the given x,y @@ -191,18 +183,16 @@ module Squib # @option opts stroke_color [String] (:black) the color with which to stroke the line. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients}. # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. # @option opts fill_color [String] ('#0000') the color with which to fill the triangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def star(opts = {}) - opts = needs(opts, [:range, :x, :y, :n, :angle, :inner_radius, :outer_radius, - :layout, :fill_color, :stroke_color, :stroke_width]) - opts[:range].each do |i| - @cards[i].star(opts[:x][i], opts[:y][i], opts[:n][i], opts[:angle][i], - opts[:inner_radius][i], opts[:outer_radius][i], - opts[:fill_color][i], opts[:stroke_color][i], - opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + poly = Args::Polygon.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(poly[i], trans[i], draw[i]) } end # Draw a regular polygon at the given x,y @@ -215,19 +205,20 @@ module Squib # @option opts y [Fixnum] (0) the y-coordinate of the center. Supports Unit Conversion, see {file:README.md#Units Units}. # @option opts n [Integer] (5) the number of points on the star # @option opts angle [Fixnum] (0) the angle at which to rotate + # @option opts radius [Fixnum] (0) the radius from center to corner. Supports Unit conversion. # @option opts stroke_color [String] (:black) the color with which to stroke the line. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients}. # @option opts stroke_width [Decimal] (2.0) the width of the outside stroke. Supports Unit Conversion, see {file:README.md#Units Units}. # @option opts fill_color [String] ('#0000') the color with which to fill the triangle. See {file:README.md#Specifying_Colors___Gradients Specifying Colors & Gradients} + # @option opts dash [String] ('') define a dash pattern for the stroke. Provide a string with space-separated numbers that define the pattern of on-and-off alternating strokes, measured in pixels by defautl. Supports Unit Conversion, see {file:README.md#Units Units} (e.g. `'0.02in 0.02in'`). # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:README.md#Custom_Layouts Custom Layouts} # @return [nil] intended to be void # @api public def polygon(opts = {}) - opts = needs(opts, [:range, :x, :y, :n, :circle_radius, :angle, :layout, :fill_color, :stroke_color, :stroke_width]) - opts[:range].each do |i| - @cards[i].polygon(opts[:x][i], opts[:y][i], opts[:n][i], opts[:angle][i], opts[:radius][i], - opts[:fill_color][i], opts[:stroke_color][i], - opts[:stroke_width][i]) - end + range = Args::CardRange.new(opts[:range], deck_size: size) + draw = Args::Draw.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) + poly = Args::Polygon.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(poly[i], trans[i], draw[i]) } end end diff --git a/lib/squib/args/arg_loader.rb b/lib/squib/args/arg_loader.rb index 9a89a58..cf9dfc5 100644 --- a/lib/squib/args/arg_loader.rb +++ b/lib/squib/args/arg_loader.rb @@ -65,7 +65,7 @@ module Squib val = instance_variable_get(attribute) if val.respond_to? :each new_val = val.map.with_index do |v, i| - v ||= layout[layout_args[i]][param] unless layout_args[i].nil? + v ||= layout[layout_args[i].to_s][param] unless layout_args[i].nil? v ||= default end instance_variable_set(attribute, new_val) @@ -78,7 +78,7 @@ module Squib # For each parameter/attribute foo we try to invoke a validate_foo def validate self.class.parameters.each do |param, default| - method = "validate_#{param}" + method = "validate_#{param}" if self.respond_to? method attribute = "@#{param}" val = instance_variable_get(attribute) diff --git a/lib/squib/args/bezier.rb b/lib/squib/args/bezier.rb new file mode 100644 index 0000000..7ed1714 --- /dev/null +++ b/lib/squib/args/bezier.rb @@ -0,0 +1,28 @@ +require 'squib/args/arg_loader' + +module Squib + # @api private + module Args + + class Bezier + include ArgLoader + + def self.parameters + { x1: 100, y1: 100, + cx1: 0 , cy1: 0, + x2: 150, y2: 150, + cx2: 0 , cy2: 0} + end + + def self.expanding_parameters + parameters.keys # all of them + end + + def self.params_with_units + parameters.keys # all of them + end + + end + + end +end \ No newline at end of file diff --git a/lib/squib/args/card_range.rb b/lib/squib/args/card_range.rb new file mode 100644 index 0000000..e39232a --- /dev/null +++ b/lib/squib/args/card_range.rb @@ -0,0 +1,28 @@ +module Squib + # @api private + module Args + class CardRange + include Enumerable + + def initialize(input, deck_size: 1) + @range = validate(input, deck_size) + end + + # Hook into enumerable by delegating to @range + def each(&block) + @range.each { |i| block.call(i) } + end + + private + def validate(input, deck_size) + input ||= :all # default + input = 0..(deck_size - 1) if input == :all + input = (input.to_i)..(input.to_i) if input.respond_to? :to_i + raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each + raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size-1}") if input.max > (deck_size - 1) + input + end + + end + end +end \ No newline at end of file diff --git a/lib/squib/args/polygon.rb b/lib/squib/args/polygon.rb new file mode 100644 index 0000000..fca6497 --- /dev/null +++ b/lib/squib/args/polygon.rb @@ -0,0 +1,26 @@ +require 'squib/args/arg_loader' + +module Squib + # @api private + module Args + + class Polygon + include ArgLoader + + def self.parameters + { x: 0, y: 0, n: 5, + radius: 100, inner_radius: 50, outer_radius: 100} + end + + def self.expanding_parameters + parameters.keys # all of them + end + + def self.params_with_units + parameters.keys # all of them + end + + end + + end +end \ No newline at end of file diff --git a/lib/squib/args/transform.rb b/lib/squib/args/transform.rb new file mode 100644 index 0000000..4c179f4 --- /dev/null +++ b/lib/squib/args/transform.rb @@ -0,0 +1,25 @@ +require 'squib/args/arg_loader' + +module Squib + # @api private + module Args + + class Transform + include ArgLoader + + def self.parameters + { angle: 0 } + end + + def self.expanding_parameters + parameters.keys # all of them + end + + def self.params_with_units + parameters.keys # all of them + end + + end + + end +end \ No newline at end of file diff --git a/lib/squib/args/tri.rb b/lib/squib/args/tri.rb new file mode 100644 index 0000000..d3e464e --- /dev/null +++ b/lib/squib/args/tri.rb @@ -0,0 +1,27 @@ +require 'squib/args/arg_loader' + +module Squib + # @api private + module Args + + class Tri + include ArgLoader + + def self.parameters + { x1: 100, y1: 100, + x2: 150, y2: 150, + x3: 100, y3: 150 } + end + + def self.expanding_parameters + parameters.keys # all of them + end + + def self.params_with_units + parameters.keys # all of them + end + + end + + end +end \ No newline at end of file diff --git a/lib/squib/graphics/cairo_context_wrapper.rb b/lib/squib/graphics/cairo_context_wrapper.rb index e2560d9..8bb72ee 100644 --- a/lib/squib/graphics/cairo_context_wrapper.rb +++ b/lib/squib/graphics/cairo_context_wrapper.rb @@ -52,19 +52,23 @@ module Squib # Convenience method for a common task # @api private - def fill_n_stroke(fill_color, stroke_color, stroke_width, - line_join = 0, line_cap = Cairo::LINE_CAP_BUTT, - dash = []) - set_source_squibcolor(fill_color) + def fill_n_stroke(draw) + set_source_squibcolor draw.fill_color fill_preserve - set_source_squibcolor(stroke_color) - set_line_width(stroke_width) - set_line_join(line_join) - set_line_cap(line_cap) - set_dash(dash) + set_source_squibcolor draw.stroke_color + set_line_width draw.stroke_width + set_line_join draw.join + set_line_cap draw.cap + set_dash draw.dash stroke end + def rotate_about(x, y, angle) + translate(x, y) + rotate(angle) + translate(-x, -y) + end + end end end \ No newline at end of file diff --git a/lib/squib/graphics/shapes.rb b/lib/squib/graphics/shapes.rb index adced19..4e9532b 100644 --- a/lib/squib/graphics/shapes.rb +++ b/lib/squib/graphics/shapes.rb @@ -7,17 +7,18 @@ module Squib def rect(box, draw) use_cairo do |cc| cc.rounded_rectangle(box.x, box.y, box.width, box.height, box.x_radius, box.y_radius) - cc.fill_n_stroke(draw.fill_color, draw.stroke_color, draw.stroke_width, draw.join, draw.cap, draw.dash) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def circle(x, y, radius, fill_color, stroke_color, stroke_width) + def circle(box, draw) + x, y, r = box.x, box.y, box.radius use_cairo do |cc| - cc.move_to(x + radius, y) - cc.circle(x, y, radius) - cc.fill_n_stroke(fill_color, stroke_color, stroke_width) + cc.move_to(x + r, y) + cc.circle(x, y, r) + cc.fill_n_stroke(draw) end end @@ -26,7 +27,8 @@ module Squib # of the rectangle. Control points are at 1/4 and 3/4 of the side. # :nodoc: # @api private - def ellipse(x, y, w, h, fill_color, stroke_color, stroke_width) + def ellipse(box, draw) + x, y, w, h = box.x, box.y, box.width, box.height use_cairo do |cc| cc.move_to(x, y + 0.5*h) # start west cc.curve_to(x, y + 0.25*h, # west to north @@ -41,67 +43,68 @@ module Squib cc.curve_to(x + 0.25*w, y + h, # south to west x, y + 0.75*h, x, y + 0.5*h) - cc.fill_n_stroke(fill_color, stroke_color, stroke_width) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def triangle(x1, y1, x2, y2, x3, y3, fill_color, stroke_color, stroke_width) + def triangle(tri, draw) use_cairo do |cc| - cc.triangle(x1, y1, x2, y2, x3, y3) - cc.fill_n_stroke(fill_color, stroke_color, stroke_width) + cc.triangle(tri.x1, tri.y1, tri.x2, tri.y2, tri.x3, tri.y3) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def line(x1, y1, x2, y2, stroke_color, stroke_width) + def line(coord, draw) use_cairo do |cc| - cc.move_to(x1, y1) - cc.line_to(x2, y2) - cc.set_source_squibcolor(stroke_color) - cc.set_line_width(stroke_width) - cc.stroke + cc.move_to(coord.x1, coord.y1) + cc.line_to(coord.x2, coord.y2) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def curve(x1, y1, cx1, cy1, x2, y2, cx2, cy2, draw) + def curve(bez, draw) + x1, y1, cx1, cy1 = bez.x1, bez.y1, bez.cx1, bez.cy1 + cx2, cy2, x2, y2 = bez.cx2, bez.cy2, bez.x2, bez.y2 use_cairo do |cc| cc.move_to(x1, y1) cc.curve_to(cx1, cy1, cx2, cy2, x2, y2) - cc.fill_n_stroke(draw.fill_color, draw.stroke_color, draw.stroke_width, draw.join, draw.cap) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def star(x, y, n, angle, inner_radius, outer_radius, fill_color, stroke_color, stroke_width) + def star(poly, trans, draw) + x, y, n = poly.x, poly.y, poly.n + inner_radius, outer_radius = poly.inner_radius, poly.outer_radius use_cairo do |cc| - cc.translate(x, y) - cc.rotate(angle) - cc.translate(-x, -y) - cc.move_to(x + outer_radius, y) #i = 0, so cos(0)=1 and sin(0)=0 - theta = Math::PI / n.to_f # i.e. (2*pi) / (2*n) - 0.upto(2 * n) do |i| - radius = i.even? ? outer_radius : inner_radius - cc.line_to(x + radius * Math::cos(i * theta), - y + radius * Math::sin(i * theta)) + poly.instance_eval do + cc.rotate_about(x, y, trans.angle) + cc.move_to(x + outer_radius, y) #i = 0, so cos(0)=1 and sin(0)=0 + theta = Math::PI / n.to_f # i.e. (2*pi) / (2*n) + 0.upto(2 * n) do |i| + radius = i.even? ? outer_radius : inner_radius + cc.line_to(x + radius * Math::cos(i * theta), + y + radius * Math::sin(i * theta)) + end end cc.close_path - cc.fill_n_stroke(fill_color, stroke_color, stroke_width) + cc.fill_n_stroke(draw) end end # :nodoc: # @api private - def polygon(x, y, n, angle, radius, fill_color, stroke_color, stroke_width) + def polygon(poly, trans, draw) + x, y, n, radius = poly.x, poly.y, poly.n, poly.radius use_cairo do |cc| - cc.translate(x, y) - cc.rotate(angle) - cc.translate(-x, -y) + cc.rotate_about(x, y, trans.angle) cc.move_to(x + radius, y) # i = 0, so cos(0)=1 and sin(0)=0 theta = (2 * Math::PI) / n.to_f 0.upto(n) do |i| @@ -109,9 +112,10 @@ module Squib y + radius * Math::sin(i * theta)) end cc.close_path - cc.fill_n_stroke(fill_color, stroke_color, stroke_width) + cc.fill_n_stroke(draw) end end end end + diff --git a/spec/args/box_spec.rb b/spec/args/box_spec.rb index 5388185..2d635b7 100644 --- a/spec/args/box_spec.rb +++ b/spec/args/box_spec.rb @@ -70,6 +70,15 @@ describe Squib::Args::Box do y: [0, 0], # Box default ) end + + it 'handles symbols' do + args = { layout: :attack } + box.load!(args, expand_by: 2, layout: layout) + expect(box).to have_attributes( + x: [50, 50], # set by layout + y: [0, 0], # Box default + ) + end end context 'unit conversion' do diff --git a/spec/args/range_spec.rb b/spec/args/range_spec.rb new file mode 100644 index 0000000..dcfe879 --- /dev/null +++ b/spec/args/range_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' +require 'squib/args/card_range' + +describe Squib::Args::CardRange do + + it 'must be within the card size range' do + expect {Squib::Args::CardRange.new(2..3, deck_size: 2)} + .to raise_error(ArgumentError, '2..3 is outside of deck range of 0..1') + end + + it 'defaults to range of all cards if :all' do + range = Squib::Args::CardRange.new(:all, deck_size: 5) + expect(range.to_a).to eq([0, 1, 2, 3, 4]) + end + + it 'creates a range of cards for singleton' do + range = Squib::Args::CardRange.new(3, deck_size: 5) + expect(range.to_a).to eq([3]) + end + + it 'lets arrays pass through unchanged' do + range = Squib::Args::CardRange.new([0, 2], deck_size: 5) + expect(range.to_a).to eq([0, 2]) + end + + it 'raises an error on everything else' do + expect { Squib::Args::CardRange.new(:foo, deck_size: 5) } + .to raise_error(ArgumentError, 'foo must be Enumerable (i.e. respond_to :each).') + end + + it 'allows anything with :to_i' do + range = Squib::Args::CardRange.new(0.9, deck_size: 5) + expect(range.to_a).to eq([0]) + end + +end \ No newline at end of file diff --git a/spec/data/samples/basic.rb.txt b/spec/data/samples/basic.rb.txt index 8d7376a..4c293bf 100644 --- a/spec/data/samples/basic.rb.txt +++ b/spec/data/samples/basic.rb.txt @@ -19,6 +19,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -27,6 +30,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -35,6 +41,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -43,6 +52,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -51,6 +63,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -59,6 +74,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/draw_shapes.rb.txt b/spec/data/samples/draw_shapes.rb.txt index 518e8c1..d5fedfe 100644 --- a/spec/data/samples/draw_shapes.rb.txt +++ b/spec/data/samples/draw_shapes.rb.txt @@ -9,6 +9,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[4.0, 2.0]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -17,6 +20,9 @@ cairo: set_source_color([:blue]) cairo: fill_preserve([]) cairo: set_source_color([:red]) cairo: set_line_width([50.0]) +cairo: set_line_join([2]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -26,6 +32,9 @@ cairo: set_source_color([:gray]) cairo: fill_preserve([]) cairo: set_source_color([:green]) cairo: set_line_width([8.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -34,13 +43,21 @@ cairo: set_source_color([:gray]) cairo: fill_preserve([]) cairo: set_source_color([:green]) cairo: set_line_width([3.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) cairo: move_to([50, 550]) cairo: line_to([150, 650]) +cairo: set_source_color(["#0000"]) +cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([25.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -50,6 +67,9 @@ cairo: set_source_color([:burgundy]) cairo: fill_preserve([]) cairo: set_source_color([:cyan]) cairo: set_line_width([12.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([1]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -62,6 +82,9 @@ cairo: set_source_color([:burgundy]) cairo: fill_preserve([]) cairo: set_source_color([:cyan]) cairo: set_line_width([5.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -85,6 +108,9 @@ cairo: set_source_color([:cyan]) cairo: fill_preserve([]) cairo: set_source_color([:burgundy]) cairo: set_line_width([3]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -103,6 +129,9 @@ cairo: set_source_color([:cyan]) cairo: fill_preserve([]) cairo: set_source_color([:burgundy]) cairo: set_line_width([2]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) surface: write_to_png(["_output/shape_00.png"]) diff --git a/spec/data/samples/embed_text.rb.txt b/spec/data/samples/embed_text.rb.txt index 28f717e..13670f3 100644 --- a/spec/data/samples/embed_text.rb.txt +++ b/spec/data/samples/embed_text.rb.txt @@ -9,6 +9,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/gradients.rb.txt b/spec/data/samples/gradients.rb.txt index 84f75a3..031adce 100644 --- a/spec/data/samples/gradients.rb.txt +++ b/spec/data/samples/gradients.rb.txt @@ -6,8 +6,13 @@ cairo: restore([]) cairo: save([]) cairo: move_to([0, 600]) cairo: line_to([825, 600]) +cairo: set_source_color(["#0000"]) +cairo: fill_preserve([]) cairo: set_source([LinearPattern]) cairo: set_line_width([15]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -17,6 +22,9 @@ cairo: set_source([RadialPattern]) cairo: fill_preserve([]) cairo: set_source_color(["#0000"]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -25,6 +33,9 @@ cairo: set_source([RadialPattern]) cairo: fill_preserve([]) cairo: set_source_color(["#0000"]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -33,6 +44,9 @@ cairo: set_source([LinearPattern]) cairo: fill_preserve([]) cairo: set_source_color(["#0000"]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -41,6 +55,9 @@ cairo: set_source([LinearPattern]) cairo: fill_preserve([]) cairo: set_source_color(["#0000"]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/hand.rb.txt b/spec/data/samples/hand.rb.txt index ab82844..30c897f 100644 --- a/spec/data/samples/hand.rb.txt +++ b/spec/data/samples/hand.rb.txt @@ -44,6 +44,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -52,6 +55,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -60,6 +66,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -68,6 +77,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -76,6 +88,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -84,6 +99,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -92,6 +110,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -100,6 +121,9 @@ cairo: set_source_color([:black]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -108,6 +132,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -116,6 +143,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -124,6 +154,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -132,6 +165,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -140,6 +176,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -148,6 +187,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -156,6 +198,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -164,6 +209,9 @@ cairo: set_source_color([:white]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/load_images.rb.txt b/spec/data/samples/load_images.rb.txt index 6f1ff3d..6e410fa 100644 --- a/spec/data/samples/load_images.rb.txt +++ b/spec/data/samples/load_images.rb.txt @@ -9,6 +9,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/saves.rb.txt b/spec/data/samples/saves.rb.txt index b4f12ee..d85a440 100644 --- a/spec/data/samples/saves.rb.txt +++ b/spec/data/samples/saves.rb.txt @@ -84,6 +84,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -92,6 +95,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -100,6 +106,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -108,6 +117,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -116,6 +128,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -124,6 +139,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -132,6 +150,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -140,6 +161,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -148,6 +172,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -156,6 +183,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -164,6 +194,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -172,6 +205,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -180,6 +216,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -188,6 +227,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -196,6 +238,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -204,6 +249,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/showcase.rb.txt b/spec/data/samples/showcase.rb.txt index 82302a1..a935bab 100644 --- a/spec/data/samples/showcase.rb.txt +++ b/spec/data/samples/showcase.rb.txt @@ -24,6 +24,9 @@ cairo: set_source_color(["#DED4B9"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -32,6 +35,9 @@ cairo: set_source_color(["#DED4B9"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -40,6 +46,9 @@ cairo: set_source_color(["#DED4B9"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -48,6 +57,9 @@ cairo: set_source_color(["#DED4B9"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/text_options.rb.txt b/spec/data/samples/text_options.rb.txt index 8cda87e..dc93441 100644 --- a/spec/data/samples/text_options.rb.txt +++ b/spec/data/samples/text_options.rb.txt @@ -19,6 +19,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -27,6 +30,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -35,6 +41,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -43,6 +52,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -51,6 +63,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -59,6 +74,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -448,6 +466,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -456,6 +477,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -464,6 +488,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/tgc_proofs.rb.txt b/spec/data/samples/tgc_proofs.rb.txt index 54d21eb..67938f3 100644 --- a/spec/data/samples/tgc_proofs.rb.txt +++ b/spec/data/samples/tgc_proofs.rb.txt @@ -9,6 +9,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -17,6 +20,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) diff --git a/spec/data/samples/units.rb.txt b/spec/data/samples/units.rb.txt index dcb92c2..dbf4c01 100644 --- a/spec/data/samples/units.rb.txt +++ b/spec/data/samples/units.rb.txt @@ -9,6 +9,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -17,6 +20,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) cairo: save([]) @@ -25,6 +31,9 @@ cairo: set_source_color(["#0000"]) cairo: fill_preserve([]) cairo: set_source_color([:black]) cairo: set_line_width([2.0]) +cairo: set_line_join([0]) +cairo: set_line_cap([0]) +cairo: set_dash([[]]) cairo: stroke([]) cairo: restore([]) surface: write_to_png(["_output/units_00.png"]) diff --git a/spec/graphics/graphics_shapes_spec.rb b/spec/graphics/graphics_shapes_spec.rb deleted file mode 100644 index 5f8a742..0000000 --- a/spec/graphics/graphics_shapes_spec.rb +++ /dev/null @@ -1,86 +0,0 @@ -require 'spec_helper' -require 'squib' - -describe Squib::Card do - - let(:deck) { double(Squib::Deck) } - let(:cxt) { double(Cairo::Context) } - - def expect_stroke(cxt, fill_color, stroke_color, stroke_width) - expect(cxt).to receive(:set_source_color).with(fill_color).once - expect(cxt).to receive(:fill_preserve).once - expect(cxt).to receive(:set_source_color).with(stroke_color).once - expect(cxt).to receive(:set_line_width).with(stroke_width).once - expect(cxt).to receive(:stroke).once - end - - before(:each) do - allow(Cairo::Context).to receive(:new).and_return(cxt) - allow(deck).to receive(:dir).and_return('_output') - allow(deck).to receive(:count_format).and_return('%02d') - allow(deck).to receive(:prefix).and_return('card_') - allow(deck).to receive(:antialias).and_return('subpixel') - allow(deck).to receive(:backend).and_return('memory') - end - - context 'rect' do - it 'make all the expected calls on a smoke test' do - expect(cxt).to receive(:antialias=).with('subpixel') - expect(cxt).to receive(:save).once - expect(cxt).to receive(:rounded_rectangle).with(37, 38, 50, 100, 10, 15).once - expect_stroke(cxt, '#fff', '#f00', 2.0) - expect(cxt).to receive(:restore).once - - card = Squib::Card.new(deck, 100, 150) - # rect(Args::Box, x_radius, y_radius, Args::Draw) - box = OpenStruct.new(x: 37, y: 38, width: 50, height: 100, x_radius: 10, y_radius: 15) - draw = OpenStruct.new(fill_color: '#fff', stroke_color: '#f00', stroke_width: 2.0) - card.rect(box, draw) - end - end - - context 'circle' do - it 'make all the expected calls on a smoke test' do - expect(cxt).to receive(:antialias=).with('subpixel') - expect(cxt).to receive(:save).once - expect(cxt).to receive(:move_to).with(137, 38) - expect(cxt).to receive(:circle).with(37, 38, 100).once - expect_stroke(cxt, '#fff', '#f00', 2.0) - expect(cxt).to receive(:restore).once - - card = Squib::Card.new(deck, 100, 150) - # circle(x, y, radius, - # fill_color, stroke_color, stroke_width) - card.circle(37, 38, 100, '#fff', '#f00', 2.0) - end - end - - context 'triangle' do - it 'make all the expected calls on a smoke test' do - expect(cxt).to receive(:antialias=).with('subpixel') - expect(cxt).to receive(:save).once - expect(cxt).to receive(:triangle).with(1, 2, 3, 4, 5, 6).once - expect_stroke(cxt, '#fff', '#f00', 2.0) - expect(cxt).to receive(:restore).once - - card = Squib::Card.new(deck, 100, 150) - card.triangle(1, 2, 3, 4, 5, 6, '#fff', '#f00', 2.0) - end - end - - context 'line' do - it 'make all the expected calls on a smoke test' do - expect(cxt).to receive(:antialias=).with('subpixel') - expect(cxt).to receive(:save).once - expect(cxt).to receive(:move_to).with(1, 2).once - expect(cxt).to receive(:line_to).with(3, 4).once - expect(cxt).to receive(:set_source_color).with('#fff').once - expect(cxt).to receive(:set_line_width).with(2.0).once - expect(cxt).to receive(:stroke).once - expect(cxt).to receive(:restore).once - - card = Squib::Card.new(deck, 100, 150) - card.line(1, 2, 3, 4, '#fff', 2.0) - end - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 502ef45..b0102f6 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -104,7 +104,7 @@ def mock_cairo(strio) set_line_width stroke fill set_source scale render_rsvg_handle circle triangle line_to operator= show_page clip transform mask rectangle reset_clip antialias= curve_to matrix= pango_layout_path stroke_preserve - fill_preserve close_path).each do |m| + fill_preserve close_path set_dash set_line_cap set_line_join).each do |m| allow(cxt).to receive(m) { |*args| strio << scrub_hex("cairo: #{m}(#{args})\n") } end diff --git a/squib.sublime-project b/squib.sublime-project index e44a8cb..708bc54 100644 --- a/squib.sublime-project +++ b/squib.sublime-project @@ -1,4 +1,6 @@ { + "tab_size": 2, + "translate_tabs_to_spaces": true, "folders": [ { @@ -21,6 +23,7 @@ // {"name": "rake run[csv_import]", "shell_cmd": "rake run[csv_import]",}, // {"name": "rake run[custom_config]", "shell_cmd": "rake run[custom_config]",}, {"name": "rake run[draw_shapes]", "shell_cmd": "rake run[draw_shapes]",}, + {"name": "rake run[layouts]", "shell_cmd": "rake run[layouts]",}, // {"name": "rake run[embed_text]", "shell_cmd": "rake run[embed_text]",}, // {"name": "rake run[load_images]", "shell_cmd": "rake run[load_images]",}, // {"name": "rake run[text_options]", "shell_cmd": "rake run[text_options]",},