squib 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +62 -14
  5. data/Gemfile +1 -1
  6. data/README.md +16 -10
  7. data/RELEASE TODO.md +2 -1
  8. data/Rakefile +11 -0
  9. data/lib/squib/api/data.rb +3 -3
  10. data/lib/squib/api/image.rb +7 -5
  11. data/lib/squib/api/save.rb +31 -2
  12. data/lib/squib/api/settings.rb +1 -1
  13. data/lib/squib/api/shapes.rb +86 -0
  14. data/lib/squib/api/text.rb +6 -2
  15. data/lib/squib/api/text_embed.rb +7 -5
  16. data/lib/squib/args/typographer.rb +22 -16
  17. data/lib/squib/card.rb +5 -5
  18. data/lib/squib/conf.rb +111 -0
  19. data/lib/squib/constants.rb +11 -31
  20. data/lib/squib/deck.rb +15 -48
  21. data/lib/squib/graphics/cairo_context_wrapper.rb +3 -1
  22. data/lib/squib/graphics/gradient_regex.rb +1 -0
  23. data/lib/squib/graphics/hand.rb +43 -0
  24. data/lib/squib/graphics/image.rb +5 -3
  25. data/lib/squib/graphics/save_doc.rb +1 -1
  26. data/lib/squib/graphics/shapes.rb +74 -0
  27. data/lib/squib/graphics/showcase.rb +5 -2
  28. data/lib/squib/graphics/text.rb +18 -7
  29. data/lib/squib/input_helpers.rb +2 -2
  30. data/lib/squib/version.rb +1 -1
  31. data/samples/csv_import.rb +3 -5
  32. data/samples/custom-config.yml +0 -1
  33. data/samples/custom_config.rb +1 -1
  34. data/samples/draw_shapes.rb +11 -0
  35. data/samples/embed_text.rb +1 -1
  36. data/samples/hand.rb +24 -0
  37. data/samples/load_images.rb +14 -0
  38. data/samples/sample.csv +3 -3
  39. data/samples/text_options.rb +4 -0
  40. data/spec/api/api_data_spec.rb +19 -0
  41. data/spec/api/api_image_spec.rb +1 -1
  42. data/spec/api/api_settings_spec.rb +18 -0
  43. data/spec/api/api_text_spec.rb +3 -3
  44. data/spec/conf_spec.rb +29 -0
  45. data/spec/data/conf/basic.yml +0 -0
  46. data/spec/data/conf/empty.yml +1 -0
  47. data/spec/data/samples/csv_import.rb.txt +4 -38
  48. data/spec/data/samples/custom_config.rb.txt +4 -0
  49. data/spec/data/samples/draw_shapes.rb.txt +57 -0
  50. data/spec/data/samples/hand.rb.txt +514 -0
  51. data/spec/data/samples/load_images.rb.txt +6 -0
  52. data/spec/data/samples/text_options.rb.txt +81 -0
  53. data/spec/data/xlsx/basic.xlsx +0 -0
  54. data/spec/data/xlsx/formulas.xlsx +0 -0
  55. data/spec/graphics/graphics_images_spec.rb +49 -48
  56. data/spec/graphics/graphics_shapes_spec.rb +43 -41
  57. data/spec/graphics/graphics_text_spec.rb +25 -11
  58. data/spec/samples/_diffs/gitkeep.txt +0 -0
  59. data/spec/samples/expected/autoscale_00.png +0 -0
  60. data/spec/samples/expected/autoscale_01.png +0 -0
  61. data/spec/samples/expected/autoscale_02.png +0 -0
  62. data/spec/samples/expected/backend_00.png +0 -0
  63. data/spec/samples/expected/backend_00.svg +78 -0
  64. data/spec/samples/expected/backend_01.png +0 -0
  65. data/spec/samples/expected/backend_01.svg +78 -0
  66. data/spec/samples/expected/basic_00.png +0 -0
  67. data/spec/samples/expected/basic_01.png +0 -0
  68. data/spec/samples/expected/basic_02.png +0 -0
  69. data/spec/samples/expected/cairo_access_00.png +0 -0
  70. data/spec/samples/expected/cairo_access_01.png +0 -0
  71. data/spec/samples/expected/card_00.png +0 -0
  72. data/spec/samples/expected/card_01.png +0 -0
  73. data/spec/samples/expected/colors_00.png +0 -0
  74. data/spec/samples/expected/config_disable_text_00.png +0 -0
  75. data/spec/samples/expected/config_text_00.png +0 -0
  76. data/spec/samples/expected/custom-config_00.png +0 -0
  77. data/spec/samples/expected/embed_00.png +0 -0
  78. data/spec/samples/expected/embed_multi_00.png +0 -0
  79. data/spec/samples/expected/embed_multi_01.png +0 -0
  80. data/spec/samples/expected/embed_multi_02.png +0 -0
  81. data/spec/samples/expected/embed_multisheet_00.png +0 -0
  82. data/spec/samples/expected/gitkeep.txt +0 -0
  83. data/spec/samples/expected/gradient_00.png +0 -0
  84. data/spec/samples/expected/hand.png +0 -0
  85. data/spec/samples/expected/hand_pretty.png +0 -0
  86. data/spec/samples/expected/landscape_00.png +0 -0
  87. data/spec/samples/expected/layout2_00.png +0 -0
  88. data/spec/samples/expected/layout_00.png +0 -0
  89. data/spec/samples/expected/layout_builtin_hand_00.png +0 -0
  90. data/spec/samples/expected/layout_builtin_playing_card_00.png +0 -0
  91. data/spec/samples/expected/load_images_00.png +0 -0
  92. data/spec/samples/expected/portrait_00.png +0 -0
  93. data/spec/samples/expected/ranges_00.png +0 -0
  94. data/spec/samples/expected/ranges_01.png +0 -0
  95. data/spec/samples/expected/ranges_02.png +0 -0
  96. data/spec/samples/expected/sample_csv_00.png +0 -0
  97. data/spec/samples/expected/sample_csv_01.png +0 -0
  98. data/spec/samples/expected/sample_excel_00.png +0 -0
  99. data/spec/samples/expected/sample_excel_01.png +0 -0
  100. data/spec/samples/expected/sample_excel_02.png +0 -0
  101. data/spec/samples/expected/save_sheet_00.png +0 -0
  102. data/spec/samples/expected/save_sheet_01.png +0 -0
  103. data/spec/samples/expected/save_sheet_range_00.png +0 -0
  104. data/spec/samples/expected/save_sheet_range_01.png +0 -0
  105. data/spec/samples/expected/save_single_sheet_00.png +0 -0
  106. data/spec/samples/expected/saves_notrim_01.png +0 -0
  107. data/spec/samples/expected/shape_00.png +0 -0
  108. data/spec/samples/expected/showcase.png +0 -0
  109. data/spec/samples/expected/showcase2.png +0 -0
  110. data/spec/samples/expected/showcase_individual_00.png +0 -0
  111. data/spec/samples/expected/showcase_individual_01.png +0 -0
  112. data/spec/samples/expected/showcase_individual_02.png +0 -0
  113. data/spec/samples/expected/showcase_individual_03.png +0 -0
  114. data/spec/samples/expected/text_00.png +0 -0
  115. data/spec/samples/expected/text_01.png +0 -0
  116. data/spec/samples/expected/text_02.png +0 -0
  117. data/spec/samples/expected/tgc_sample_00.png +0 -0
  118. data/spec/samples/expected/units_00.png +0 -0
  119. data/spec/samples/samples_regression_spec.rb +7 -5
  120. data/spec/samples/sanity.html.erb +28 -0
  121. data/spec/samples/sanity.rb +70 -0
  122. data/spec/spec_helper.rb +15 -1
  123. data/squib.gemspec +3 -1
  124. data/squib.sublime-project +27 -40
  125. metadata +177 -4
@@ -23,7 +23,7 @@ describe Squib::Deck, 'images' do
23
23
  it 'calls Card#svg, Dir, and progress bar' do
24
24
  card = instance_double(Squib::Card)
25
25
  progress = double(Squib::Progress)
26
- expect(card).to receive(:svg).with('foo', '#bar', 0, 1, 20, 30, 0.5, :overlay, 0.75, nil).once
26
+ expect(card).to receive(:svg).with('foo', nil, '#bar', 0, 1, 20, 30, 0.5, :overlay, 0.75, nil).once
27
27
  expect(Dir).to receive(:chdir).with('.').and_yield.once
28
28
  expect(progress).to receive(:start).and_yield(progress).once
29
29
  expect(progress).to receive(:increment).once
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Squib::Deck do
4
+
5
+ context '#hint' do
6
+
7
+ it 'sets hinting to conf' do
8
+ mock_conf = double(Squib::Conf)
9
+ expect(mock_conf).to receive(:text_hint=).with(:cyan).once
10
+ Squib::Deck.new do
11
+ @conf = mock_conf
12
+ hint text: :cyan
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -6,7 +6,7 @@ describe Squib::Deck, '#text' do
6
6
  context 'fonts' do
7
7
  it "should use the default font when #text and #set_font don't specify" do
8
8
  card = instance_double(Squib::Card)
9
- expect(card).to receive(:text).with(anything, 'a', 'Arial 36', *([anything] * 15)).once
9
+ expect(card).to receive(:text).with(anything, 'a', 'Arial 36', *([anything] * 17)).once
10
10
  Squib::Deck.new do
11
11
  @cards = [card]
12
12
  text str: 'a'
@@ -15,7 +15,7 @@ describe Squib::Deck, '#text' do
15
15
 
16
16
  it "should use the #set_font when #text doesn't specify" do
17
17
  card = instance_double(Squib::Card)
18
- expect(card).to receive(:text).with(anything, 'a', 'Times New Roman 16', *([anything] * 15)).once
18
+ expect(card).to receive(:text).with(anything, 'a', 'Times New Roman 16', *([anything] * 17)).once
19
19
  Squib::Deck.new do
20
20
  @cards = [card]
21
21
  set font: 'Times New Roman 16'
@@ -25,7 +25,7 @@ describe Squib::Deck, '#text' do
25
25
 
26
26
  it 'should use the specified font no matter what' do
27
27
  card = instance_double(Squib::Card)
28
- expect(card).to receive(:text).with(anything, 'a', 'Arial 18', *([anything] * 15)).once
28
+ expect(card).to receive(:text).with(anything, 'a', 'Arial 18', *([anything] * 17)).once
29
29
  Squib::Deck.new do
30
30
  @cards = [card]
31
31
  set font: 'Times New Roman 16'
@@ -0,0 +1,29 @@
1
+ require 'squib'
2
+ require 'spec_helper'
3
+
4
+ describe Squib::Conf do
5
+
6
+ it 'parses the project template file just fine' do
7
+ conf = Squib::Conf.load(project_template('config.yml'))
8
+ expect(conf.backend).to eq(Squib::Conf::DEFAULTS['backend'])
9
+ end
10
+
11
+ it 'parses an empty file' do
12
+ conf = Squib::Conf.load(conf('empty.yml'))
13
+ expect(conf.backend).to eq(Squib::Conf::DEFAULTS['backend'])
14
+ end
15
+
16
+ it 'parses the sample custom config' do
17
+ conf = Squib::Conf.load(sample_file('custom-config.yml'))
18
+ expect(conf.progress_bars).to be true
19
+ expect(conf.text_hint).to eq '#FF0000'
20
+ expect(conf.custom_colors).to eq({ 'foo' => '#ccc' })
21
+ expect(conf.img_dir).to eq 'customconfig-imgdir'
22
+ end
23
+
24
+ it 'normalizes antialias automatically' do
25
+ expect(Squib::Conf::DEFAULTS['antialias']).to eq 'best'
26
+ expect(Squib::Conf.new.antialias).to eq 'subpixel'
27
+ end
28
+
29
+ end
File without changes
@@ -0,0 +1 @@
1
+ # Intentionally empty
@@ -14,7 +14,7 @@ cairo: translate([250, 55])
14
14
  cairo: rotate([0])
15
15
  cairo: move_to([0, 0])
16
16
  pango: font_description=([MockDouble])
17
- pango: text=([""])
17
+ pango: text=(["Thief"])
18
18
  pango: wrap=([#<Pango::Layout::WrapMode word-char>])
19
19
  pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
20
20
  pango: alignment=([#<Pango::Layout::Alignment left>])
@@ -31,7 +31,7 @@ cairo: translate([250, 55])
31
31
  cairo: rotate([0])
32
32
  cairo: move_to([0, 0])
33
33
  pango: font_description=([MockDouble])
34
- pango: text=([""])
34
+ pango: text=(["Mastermind"])
35
35
  pango: wrap=([#<Pango::Layout::WrapMode word-char>])
36
36
  pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
37
37
  pango: alignment=([#<Pango::Layout::Alignment left>])
@@ -48,7 +48,7 @@ cairo: translate([65, 65])
48
48
  cairo: rotate([0])
49
49
  cairo: move_to([0, 0])
50
50
  pango: font_description=([MockDouble])
51
- pango: text=([""])
51
+ pango: text=(["1"])
52
52
  pango: wrap=([#<Pango::Layout::WrapMode word-char>])
53
53
  pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
54
54
  pango: alignment=([#<Pango::Layout::Alignment left>])
@@ -65,41 +65,7 @@ cairo: translate([65, 65])
65
65
  cairo: rotate([0])
66
66
  cairo: move_to([0, 0])
67
67
  pango: font_description=([MockDouble])
68
- pango: text=([""])
69
- pango: wrap=([#<Pango::Layout::WrapMode word-char>])
70
- pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
71
- pango: alignment=([#<Pango::Layout::Alignment left>])
72
- pango: justify=([false])
73
- pango: spacing=([0])
74
- cairo: update_pango_layout([MockDouble])
75
- cairo: move_to([0, 0])
76
- cairo: update_pango_layout([MockDouble])
77
- cairo: show_pango_layout([MockDouble])
78
- cairo: restore([])
79
- cairo: save([])
80
- cairo: set_source_color([:black])
81
- cairo: translate([65, 600])
82
- cairo: rotate([0])
83
- cairo: move_to([0, 0])
84
- pango: font_description=([MockDouble])
85
- pango: text=([""])
86
- pango: wrap=([#<Pango::Layout::WrapMode word-char>])
87
- pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
88
- pango: alignment=([#<Pango::Layout::Alignment left>])
89
- pango: justify=([false])
90
- pango: spacing=([0])
91
- cairo: update_pango_layout([MockDouble])
92
- cairo: move_to([0, 0])
93
- cairo: update_pango_layout([MockDouble])
94
- cairo: show_pango_layout([MockDouble])
95
- cairo: restore([])
96
- cairo: save([])
97
- cairo: set_source_color([:black])
98
- cairo: translate([65, 600])
99
- cairo: rotate([0])
100
- cairo: move_to([0, 0])
101
- pango: font_description=([MockDouble])
102
- pango: text=([""])
68
+ pango: text=(["2"])
103
69
  pango: wrap=([#<Pango::Layout::WrapMode word-char>])
104
70
  pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
105
71
  pango: alignment=([#<Pango::Layout::Alignment left>])
@@ -20,6 +20,10 @@ cairo: update_pango_layout([MockDouble])
20
20
  cairo: move_to([0, 0])
21
21
  cairo: update_pango_layout([MockDouble])
22
22
  cairo: show_pango_layout([MockDouble])
23
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
24
+ cairo: set_source_color(["#FF0000"])
25
+ cairo: set_line_width([2.0])
26
+ cairo: stroke([])
23
27
  cairo: restore([])
24
28
  cairo: save([])
25
29
  cairo: translate([620, 75])
@@ -1,5 +1,9 @@
1
1
  cairo: antialias=(["subpixel"])
2
2
  cairo: save([])
3
+ cairo: set_source_color([:white])
4
+ cairo: paint([])
5
+ cairo: restore([])
6
+ cairo: save([])
3
7
  cairo: rounded_rectangle([300, 300, 400, 400, 0, 0])
4
8
  cairo: set_source_color([:red])
5
9
  cairo: set_line_width([50.0])
@@ -45,4 +49,57 @@ cairo: curve_to([150, 700, 150, 700, 625, 900])
45
49
  cairo: set_source_color([:burgundy])
46
50
  cairo: fill([])
47
51
  cairo: restore([])
52
+ cairo: save([])
53
+ cairo: move_to([50, 975.0])
54
+ cairo: curve_to([50, 950.0, 100.0, 925, 150.0, 925])
55
+ cairo: curve_to([200.0, 925, 250, 950.0, 250, 975.0])
56
+ cairo: curve_to([250, 1000.0, 200.0, 1025, 150.0, 1025])
57
+ cairo: curve_to([100.0, 1025, 50, 1000.0, 50, 975.0])
58
+ cairo: set_source_color([:cyan])
59
+ cairo: set_line_width([5.0])
60
+ cairo: stroke_preserve([])
61
+ cairo: set_source_color([:burgundy])
62
+ cairo: fill([])
63
+ cairo: restore([])
64
+ cairo: save([])
65
+ cairo: translate([300, 1000])
66
+ cairo: rotate([0])
67
+ cairo: translate([-300, -1000])
68
+ cairo: move_to([325, 1000])
69
+ cairo: line_to([325.0, 1000.0])
70
+ cairo: line_to([308.09016994374946, 1005.8778525229247])
71
+ cairo: line_to([307.7254248593737, 1023.7764129073788])
72
+ cairo: line_to([296.90983005625054, 1009.5105651629515])
73
+ cairo: line_to([279.7745751406263, 1014.6946313073119])
74
+ cairo: line_to([290.0, 1000.0])
75
+ cairo: line_to([279.7745751406263, 985.3053686926881])
76
+ cairo: line_to([296.90983005625054, 990.4894348370485])
77
+ cairo: line_to([307.7254248593737, 976.2235870926212])
78
+ cairo: line_to([308.09016994374946, 994.1221474770753])
79
+ cairo: line_to([325.0, 1000.0])
80
+ cairo: close_path([])
81
+ cairo: set_source_color([:cyan])
82
+ cairo: set_line_width([3])
83
+ cairo: fill_preserve([])
84
+ cairo: set_source_color([:burgundy])
85
+ cairo: stroke([])
86
+ cairo: restore([])
87
+ cairo: save([])
88
+ cairo: translate([500, 1000])
89
+ cairo: rotate([1.5707963267948966])
90
+ cairo: translate([-500, -1000])
91
+ cairo: move_to([525, 1000])
92
+ cairo: line_to([525.0, 1000.0])
93
+ cairo: line_to([507.7254248593737, 1023.7764129073788])
94
+ cairo: line_to([479.7745751406263, 1014.6946313073119])
95
+ cairo: line_to([479.7745751406263, 985.3053686926881])
96
+ cairo: line_to([507.7254248593737, 976.2235870926212])
97
+ cairo: line_to([525.0, 1000.0])
98
+ cairo: close_path([])
99
+ cairo: set_source_color([:cyan])
100
+ cairo: set_line_width([2])
101
+ cairo: fill_preserve([])
102
+ cairo: set_source_color([:burgundy])
103
+ cairo: stroke([])
104
+ cairo: restore([])
48
105
  surface: write_to_png(["_output/shape_00.png"])
@@ -0,0 +1,514 @@
1
+ cairo: antialias=(["subpixel"])
2
+ cairo: antialias=(["subpixel"])
3
+ cairo: antialias=(["subpixel"])
4
+ cairo: antialias=(["subpixel"])
5
+ cairo: antialias=(["subpixel"])
6
+ cairo: antialias=(["subpixel"])
7
+ cairo: antialias=(["subpixel"])
8
+ cairo: antialias=(["subpixel"])
9
+ cairo: save([])
10
+ cairo: set_source_color([:cyan])
11
+ cairo: paint([])
12
+ cairo: restore([])
13
+ cairo: save([])
14
+ cairo: set_source_color([:cyan])
15
+ cairo: paint([])
16
+ cairo: restore([])
17
+ cairo: save([])
18
+ cairo: set_source_color([:cyan])
19
+ cairo: paint([])
20
+ cairo: restore([])
21
+ cairo: save([])
22
+ cairo: set_source_color([:cyan])
23
+ cairo: paint([])
24
+ cairo: restore([])
25
+ cairo: save([])
26
+ cairo: set_source_color([:cyan])
27
+ cairo: paint([])
28
+ cairo: restore([])
29
+ cairo: save([])
30
+ cairo: set_source_color([:cyan])
31
+ cairo: paint([])
32
+ cairo: restore([])
33
+ cairo: save([])
34
+ cairo: set_source_color([:cyan])
35
+ cairo: paint([])
36
+ cairo: restore([])
37
+ cairo: save([])
38
+ cairo: set_source_color([:cyan])
39
+ cairo: paint([])
40
+ cairo: restore([])
41
+ cairo: save([])
42
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
43
+ cairo: set_source_color([:black])
44
+ cairo: set_line_width([2.0])
45
+ cairo: stroke([])
46
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
47
+ cairo: set_source_color([:black])
48
+ cairo: fill([])
49
+ cairo: restore([])
50
+ cairo: save([])
51
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
52
+ cairo: set_source_color([:black])
53
+ cairo: set_line_width([2.0])
54
+ cairo: stroke([])
55
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
56
+ cairo: set_source_color([:black])
57
+ cairo: fill([])
58
+ cairo: restore([])
59
+ cairo: save([])
60
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
61
+ cairo: set_source_color([:black])
62
+ cairo: set_line_width([2.0])
63
+ cairo: stroke([])
64
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
65
+ cairo: set_source_color([:black])
66
+ cairo: fill([])
67
+ cairo: restore([])
68
+ cairo: save([])
69
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
70
+ cairo: set_source_color([:black])
71
+ cairo: set_line_width([2.0])
72
+ cairo: stroke([])
73
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
74
+ cairo: set_source_color([:black])
75
+ cairo: fill([])
76
+ cairo: restore([])
77
+ cairo: save([])
78
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
79
+ cairo: set_source_color([:black])
80
+ cairo: set_line_width([2.0])
81
+ cairo: stroke([])
82
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
83
+ cairo: set_source_color([:black])
84
+ cairo: fill([])
85
+ cairo: restore([])
86
+ cairo: save([])
87
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
88
+ cairo: set_source_color([:black])
89
+ cairo: set_line_width([2.0])
90
+ cairo: stroke([])
91
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
92
+ cairo: set_source_color([:black])
93
+ cairo: fill([])
94
+ cairo: restore([])
95
+ cairo: save([])
96
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
97
+ cairo: set_source_color([:black])
98
+ cairo: set_line_width([2.0])
99
+ cairo: stroke([])
100
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
101
+ cairo: set_source_color([:black])
102
+ cairo: fill([])
103
+ cairo: restore([])
104
+ cairo: save([])
105
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
106
+ cairo: set_source_color([:black])
107
+ cairo: set_line_width([2.0])
108
+ cairo: stroke([])
109
+ cairo: rounded_rectangle([37, 37, 750, 1050, 25, 25])
110
+ cairo: set_source_color([:black])
111
+ cairo: fill([])
112
+ cairo: restore([])
113
+ cairo: save([])
114
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
115
+ cairo: set_source_color([:black])
116
+ cairo: set_line_width([2.0])
117
+ cairo: stroke([])
118
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
119
+ cairo: set_source_color([:white])
120
+ cairo: fill([])
121
+ cairo: restore([])
122
+ cairo: save([])
123
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
124
+ cairo: set_source_color([:black])
125
+ cairo: set_line_width([2.0])
126
+ cairo: stroke([])
127
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
128
+ cairo: set_source_color([:white])
129
+ cairo: fill([])
130
+ cairo: restore([])
131
+ cairo: save([])
132
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
133
+ cairo: set_source_color([:black])
134
+ cairo: set_line_width([2.0])
135
+ cairo: stroke([])
136
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
137
+ cairo: set_source_color([:white])
138
+ cairo: fill([])
139
+ cairo: restore([])
140
+ cairo: save([])
141
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
142
+ cairo: set_source_color([:black])
143
+ cairo: set_line_width([2.0])
144
+ cairo: stroke([])
145
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
146
+ cairo: set_source_color([:white])
147
+ cairo: fill([])
148
+ cairo: restore([])
149
+ cairo: save([])
150
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
151
+ cairo: set_source_color([:black])
152
+ cairo: set_line_width([2.0])
153
+ cairo: stroke([])
154
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
155
+ cairo: set_source_color([:white])
156
+ cairo: fill([])
157
+ cairo: restore([])
158
+ cairo: save([])
159
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
160
+ cairo: set_source_color([:black])
161
+ cairo: set_line_width([2.0])
162
+ cairo: stroke([])
163
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
164
+ cairo: set_source_color([:white])
165
+ cairo: fill([])
166
+ cairo: restore([])
167
+ cairo: save([])
168
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
169
+ cairo: set_source_color([:black])
170
+ cairo: set_line_width([2.0])
171
+ cairo: stroke([])
172
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
173
+ cairo: set_source_color([:white])
174
+ cairo: fill([])
175
+ cairo: restore([])
176
+ cairo: save([])
177
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
178
+ cairo: set_source_color([:black])
179
+ cairo: set_line_width([2.0])
180
+ cairo: stroke([])
181
+ cairo: rounded_rectangle([75, 75, 675, 975, 20, 20])
182
+ cairo: set_source_color([:white])
183
+ cairo: fill([])
184
+ cairo: restore([])
185
+ cairo: save([])
186
+ cairo: set_source_color([:black])
187
+ cairo: translate([75, 75])
188
+ cairo: rotate([0])
189
+ cairo: move_to([0, 0])
190
+ pango: font_description=([MockDouble])
191
+ pango: text=(["A"])
192
+ pango: width=([204800])
193
+ pango: height=([204800])
194
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
195
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
196
+ pango: alignment=([#<Pango::Layout::Alignment left>])
197
+ pango: justify=([false])
198
+ pango: spacing=([0])
199
+ cairo: update_pango_layout([MockDouble])
200
+ cairo: move_to([0, 0])
201
+ cairo: update_pango_layout([MockDouble])
202
+ cairo: show_pango_layout([MockDouble])
203
+ cairo: restore([])
204
+ cairo: save([])
205
+ cairo: set_source_color([:black])
206
+ cairo: translate([75, 75])
207
+ cairo: rotate([0])
208
+ cairo: move_to([0, 0])
209
+ pango: font_description=([MockDouble])
210
+ pango: text=(["B"])
211
+ pango: width=([204800])
212
+ pango: height=([204800])
213
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
214
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
215
+ pango: alignment=([#<Pango::Layout::Alignment left>])
216
+ pango: justify=([false])
217
+ pango: spacing=([0])
218
+ cairo: update_pango_layout([MockDouble])
219
+ cairo: move_to([0, 0])
220
+ cairo: update_pango_layout([MockDouble])
221
+ cairo: show_pango_layout([MockDouble])
222
+ cairo: restore([])
223
+ cairo: save([])
224
+ cairo: set_source_color([:black])
225
+ cairo: translate([75, 75])
226
+ cairo: rotate([0])
227
+ cairo: move_to([0, 0])
228
+ pango: font_description=([MockDouble])
229
+ pango: text=(["C"])
230
+ pango: width=([204800])
231
+ pango: height=([204800])
232
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
233
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
234
+ pango: alignment=([#<Pango::Layout::Alignment left>])
235
+ pango: justify=([false])
236
+ pango: spacing=([0])
237
+ cairo: update_pango_layout([MockDouble])
238
+ cairo: move_to([0, 0])
239
+ cairo: update_pango_layout([MockDouble])
240
+ cairo: show_pango_layout([MockDouble])
241
+ cairo: restore([])
242
+ cairo: save([])
243
+ cairo: set_source_color([:black])
244
+ cairo: translate([75, 75])
245
+ cairo: rotate([0])
246
+ cairo: move_to([0, 0])
247
+ pango: font_description=([MockDouble])
248
+ pango: text=(["D"])
249
+ pango: width=([204800])
250
+ pango: height=([204800])
251
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
252
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
253
+ pango: alignment=([#<Pango::Layout::Alignment left>])
254
+ pango: justify=([false])
255
+ pango: spacing=([0])
256
+ cairo: update_pango_layout([MockDouble])
257
+ cairo: move_to([0, 0])
258
+ cairo: update_pango_layout([MockDouble])
259
+ cairo: show_pango_layout([MockDouble])
260
+ cairo: restore([])
261
+ cairo: save([])
262
+ cairo: set_source_color([:black])
263
+ cairo: translate([75, 75])
264
+ cairo: rotate([0])
265
+ cairo: move_to([0, 0])
266
+ pango: font_description=([MockDouble])
267
+ pango: text=(["E"])
268
+ pango: width=([204800])
269
+ pango: height=([204800])
270
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
271
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
272
+ pango: alignment=([#<Pango::Layout::Alignment left>])
273
+ pango: justify=([false])
274
+ pango: spacing=([0])
275
+ cairo: update_pango_layout([MockDouble])
276
+ cairo: move_to([0, 0])
277
+ cairo: update_pango_layout([MockDouble])
278
+ cairo: show_pango_layout([MockDouble])
279
+ cairo: restore([])
280
+ cairo: save([])
281
+ cairo: set_source_color([:black])
282
+ cairo: translate([75, 75])
283
+ cairo: rotate([0])
284
+ cairo: move_to([0, 0])
285
+ pango: font_description=([MockDouble])
286
+ pango: text=(["F"])
287
+ pango: width=([204800])
288
+ pango: height=([204800])
289
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
290
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
291
+ pango: alignment=([#<Pango::Layout::Alignment left>])
292
+ pango: justify=([false])
293
+ pango: spacing=([0])
294
+ cairo: update_pango_layout([MockDouble])
295
+ cairo: move_to([0, 0])
296
+ cairo: update_pango_layout([MockDouble])
297
+ cairo: show_pango_layout([MockDouble])
298
+ cairo: restore([])
299
+ cairo: save([])
300
+ cairo: set_source_color([:black])
301
+ cairo: translate([75, 75])
302
+ cairo: rotate([0])
303
+ cairo: move_to([0, 0])
304
+ pango: font_description=([MockDouble])
305
+ pango: text=(["G"])
306
+ pango: width=([204800])
307
+ pango: height=([204800])
308
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
309
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
310
+ pango: alignment=([#<Pango::Layout::Alignment left>])
311
+ pango: justify=([false])
312
+ pango: spacing=([0])
313
+ cairo: update_pango_layout([MockDouble])
314
+ cairo: move_to([0, 0])
315
+ cairo: update_pango_layout([MockDouble])
316
+ cairo: show_pango_layout([MockDouble])
317
+ cairo: restore([])
318
+ cairo: save([])
319
+ cairo: set_source_color([:black])
320
+ cairo: translate([75, 75])
321
+ cairo: rotate([0])
322
+ cairo: move_to([0, 0])
323
+ pango: font_description=([MockDouble])
324
+ pango: text=(["H"])
325
+ pango: width=([204800])
326
+ pango: height=([204800])
327
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
328
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
329
+ pango: alignment=([#<Pango::Layout::Alignment left>])
330
+ pango: justify=([false])
331
+ pango: spacing=([0])
332
+ cairo: update_pango_layout([MockDouble])
333
+ cairo: move_to([0, 0])
334
+ cairo: update_pango_layout([MockDouble])
335
+ cairo: show_pango_layout([MockDouble])
336
+ cairo: restore([])
337
+ cairo: translate([2193.75, 2193.75])
338
+ cairo: rotate([-0.7853981633974483])
339
+ cairo: translate([-825, -825])
340
+ cairo: translate([412.5, 1462.5])
341
+ cairo: rotate([0.19634954084936207])
342
+ cairo: translate([-412.5, -1462.5])
343
+ cairo: save([])
344
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
345
+ cairo: clip([])
346
+ cairo: set_source([MockDouble])
347
+ cairo: paint([])
348
+ cairo: reset_clip([])
349
+ cairo: restore([])
350
+ cairo: translate([412.5, 1462.5])
351
+ cairo: rotate([0.19634954084936207])
352
+ cairo: translate([-412.5, -1462.5])
353
+ cairo: save([])
354
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
355
+ cairo: clip([])
356
+ cairo: set_source([MockDouble])
357
+ cairo: paint([])
358
+ cairo: reset_clip([])
359
+ cairo: restore([])
360
+ cairo: translate([412.5, 1462.5])
361
+ cairo: rotate([0.19634954084936207])
362
+ cairo: translate([-412.5, -1462.5])
363
+ cairo: save([])
364
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
365
+ cairo: clip([])
366
+ cairo: set_source([MockDouble])
367
+ cairo: paint([])
368
+ cairo: reset_clip([])
369
+ cairo: restore([])
370
+ cairo: translate([412.5, 1462.5])
371
+ cairo: rotate([0.19634954084936207])
372
+ cairo: translate([-412.5, -1462.5])
373
+ cairo: save([])
374
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
375
+ cairo: clip([])
376
+ cairo: set_source([MockDouble])
377
+ cairo: paint([])
378
+ cairo: reset_clip([])
379
+ cairo: restore([])
380
+ cairo: translate([412.5, 1462.5])
381
+ cairo: rotate([0.19634954084936207])
382
+ cairo: translate([-412.5, -1462.5])
383
+ cairo: save([])
384
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
385
+ cairo: clip([])
386
+ cairo: set_source([MockDouble])
387
+ cairo: paint([])
388
+ cairo: reset_clip([])
389
+ cairo: restore([])
390
+ cairo: translate([412.5, 1462.5])
391
+ cairo: rotate([0.19634954084936207])
392
+ cairo: translate([-412.5, -1462.5])
393
+ cairo: save([])
394
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
395
+ cairo: clip([])
396
+ cairo: set_source([MockDouble])
397
+ cairo: paint([])
398
+ cairo: reset_clip([])
399
+ cairo: restore([])
400
+ cairo: translate([412.5, 1462.5])
401
+ cairo: rotate([0.19634954084936207])
402
+ cairo: translate([-412.5, -1462.5])
403
+ cairo: save([])
404
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
405
+ cairo: clip([])
406
+ cairo: set_source([MockDouble])
407
+ cairo: paint([])
408
+ cairo: reset_clip([])
409
+ cairo: restore([])
410
+ cairo: translate([412.5, 1462.5])
411
+ cairo: rotate([0.19634954084936207])
412
+ cairo: translate([-412.5, -1462.5])
413
+ cairo: save([])
414
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
415
+ cairo: clip([])
416
+ cairo: set_source([MockDouble])
417
+ cairo: paint([])
418
+ cairo: reset_clip([])
419
+ cairo: restore([])
420
+ cairo: set_source_color([:white])
421
+ cairo: paint([])
422
+ cairo: translate([75, 75])
423
+ cairo: set_source([MockDouble])
424
+ cairo: paint([])
425
+ surface: write_to_png(["_output/hand.png"])
426
+ cairo: translate([1687.5, 1687.5])
427
+ cairo: rotate([-0.7853981633974483])
428
+ cairo: translate([-825, -825])
429
+ cairo: translate([412.5, 1125])
430
+ cairo: rotate([0.19634954084936207])
431
+ cairo: translate([-412.5, -1125])
432
+ cairo: save([])
433
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
434
+ cairo: clip([])
435
+ cairo: set_source([MockDouble])
436
+ cairo: paint([])
437
+ cairo: reset_clip([])
438
+ cairo: restore([])
439
+ cairo: translate([412.5, 1125])
440
+ cairo: rotate([0.19634954084936207])
441
+ cairo: translate([-412.5, -1125])
442
+ cairo: save([])
443
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
444
+ cairo: clip([])
445
+ cairo: set_source([MockDouble])
446
+ cairo: paint([])
447
+ cairo: reset_clip([])
448
+ cairo: restore([])
449
+ cairo: translate([412.5, 1125])
450
+ cairo: rotate([0.19634954084936207])
451
+ cairo: translate([-412.5, -1125])
452
+ cairo: save([])
453
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
454
+ cairo: clip([])
455
+ cairo: set_source([MockDouble])
456
+ cairo: paint([])
457
+ cairo: reset_clip([])
458
+ cairo: restore([])
459
+ cairo: translate([412.5, 1125])
460
+ cairo: rotate([0.19634954084936207])
461
+ cairo: translate([-412.5, -1125])
462
+ cairo: save([])
463
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
464
+ cairo: clip([])
465
+ cairo: set_source([MockDouble])
466
+ cairo: paint([])
467
+ cairo: reset_clip([])
468
+ cairo: restore([])
469
+ cairo: translate([412.5, 1125])
470
+ cairo: rotate([0.19634954084936207])
471
+ cairo: translate([-412.5, -1125])
472
+ cairo: save([])
473
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
474
+ cairo: clip([])
475
+ cairo: set_source([MockDouble])
476
+ cairo: paint([])
477
+ cairo: reset_clip([])
478
+ cairo: restore([])
479
+ cairo: translate([412.5, 1125])
480
+ cairo: rotate([0.19634954084936207])
481
+ cairo: translate([-412.5, -1125])
482
+ cairo: save([])
483
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
484
+ cairo: clip([])
485
+ cairo: set_source([MockDouble])
486
+ cairo: paint([])
487
+ cairo: reset_clip([])
488
+ cairo: restore([])
489
+ cairo: translate([412.5, 1125])
490
+ cairo: rotate([0.19634954084936207])
491
+ cairo: translate([-412.5, -1125])
492
+ cairo: save([])
493
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
494
+ cairo: clip([])
495
+ cairo: set_source([MockDouble])
496
+ cairo: paint([])
497
+ cairo: reset_clip([])
498
+ cairo: restore([])
499
+ cairo: translate([412.5, 1125])
500
+ cairo: rotate([0.19634954084936207])
501
+ cairo: translate([-412.5, -1125])
502
+ cairo: save([])
503
+ cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
504
+ cairo: clip([])
505
+ cairo: set_source([MockDouble])
506
+ cairo: paint([])
507
+ cairo: reset_clip([])
508
+ cairo: restore([])
509
+ cairo: set_source_color([:white])
510
+ cairo: paint([])
511
+ cairo: translate([75, 75])
512
+ cairo: set_source([MockDouble])
513
+ cairo: paint([])
514
+ surface: write_to_png(["_output/hand_pretty.png"])