diff --git a/samples/hand.rb b/samples/hand.rb index 96e21ec..45a043e 100644 --- a/samples/hand.rb +++ b/samples/hand.rb @@ -17,5 +17,8 @@ Squib::Deck.new(cards: 8, layout: 'playing-card.yml') do radius: 0, range: 7.downto(0), file: 'hand_pretty.png' + + # Tip: you can have the top card be on the left by reversing the range + # angle_range: (Math::PI / 4)..(Math::PI / -4) end diff --git a/spec/data/samples/hand.rb.txt b/spec/data/samples/hand.rb.txt new file mode 100644 index 0000000..edd1de6 --- /dev/null +++ b/spec/data/samples/hand.rb.txt @@ -0,0 +1,514 @@ +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: antialias=(["subpixel"]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:cyan]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25]) +cairo: set_source_color([:black]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:black]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([75, 75, 675, 975, 20, 20]) +cairo: set_source_color([:white]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["A"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["B"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["C"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["D"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["E"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["F"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["G"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([:black]) +cairo: translate([75, 75]) +cairo: rotate([0]) +cairo: move_to([0, 0]) +pango: font_description=([MockDouble]) +pango: text=(["H"]) +pango: width=([204800]) +pango: height=([204800]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: move_to([0, 0]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: translate([2193.75, 2193.75]) +cairo: rotate([-0.7853981633974483]) +cairo: translate([-825, -825]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1462.5]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1462.5]) +cairo: save([]) +cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: set_source_color([:white]) +cairo: paint([]) +cairo: translate([75, 75]) +cairo: set_source([MockDouble]) +cairo: paint([]) +surface: write_to_png(["_output/hand.png"]) +cairo: translate([1687.5, 1687.5]) +cairo: rotate([-0.7853981633974483]) +cairo: translate([-825, -825]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: translate([412.5, 1125]) +cairo: rotate([0.19634954084936207]) +cairo: translate([-412.5, -1125]) +cairo: save([]) +cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25]) +cairo: clip([]) +cairo: set_source([MockDouble]) +cairo: paint([]) +cairo: reset_clip([]) +cairo: restore([]) +cairo: set_source_color([:white]) +cairo: paint([]) +cairo: translate([75, 75]) +cairo: set_source([MockDouble]) +cairo: paint([]) +surface: write_to_png(["_output/hand_pretty.png"]) diff --git a/spec/samples/expected/hand.png b/spec/samples/expected/hand.png new file mode 100644 index 0000000..25cb8bc Binary files /dev/null and b/spec/samples/expected/hand.png differ diff --git a/spec/samples/expected/hand_pretty.png b/spec/samples/expected/hand_pretty.png new file mode 100644 index 0000000..95613b8 Binary files /dev/null and b/spec/samples/expected/hand_pretty.png differ diff --git a/spec/samples/samples_regression_spec.rb b/spec/samples/samples_regression_spec.rb index 754fe48..f8c9e14 100644 --- a/spec/samples/samples_regression_spec.rb +++ b/spec/samples/samples_regression_spec.rb @@ -58,6 +58,7 @@ describe "Squib samples" do embed_text.rb excel.rb gradients.rb + hand.rb hello_world.rb load_images.rb portrait-landscape.rb diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2d98218..04d1302 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -79,6 +79,7 @@ def mock_cairo(strio) allow(Cairo::ImageSurface).to receive(:new).and_return(surface) allow(surface).to receive(:width).and_return(100) allow(surface).to receive(:height).and_return(101) + allow(surface).to receive(:ink_extents).and_return([0,0,100,100]) allow(Cairo::Context).to receive(:new).and_return(cxt) allow(cxt).to receive(:create_pango_layout).and_return(pango) allow(cxt).to receive(:target).and_return(surface)