squib 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,12 +14,18 @@ module Squib
14
14
 
15
15
  # :nodoc:
16
16
  # @api private
17
- def png(file, x, y, alpha, blend, angle)
17
+ def png(file, x, y, width, height, alpha, blend, angle)
18
18
  Squib.logger.debug {"Rendering: #{file} @#{x},#{y} #{width}x#{height}, alpha: #{alpha}, blend: #{blend}, angle: #{angle}"}
19
19
  return if file.nil? or file.eql? ''
20
20
  png = Squib.cache_load_image(file)
21
21
  use_cairo do |cc|
22
22
  cc.translate(x, y)
23
+ if width != :native || height != :native
24
+ width == :native && width = png.width.to_f
25
+ height == :native && height = png.height.to_f
26
+ Squib.logger.warn "PNG scaling results in antialiasing."
27
+ cc.scale(width.to_f / png.width.to_f, height.to_f / png.height.to_f)
28
+ end
23
29
  cc.rotate(angle)
24
30
  cc.translate(-1 * x, -1 * y)
25
31
  cc.set_source(png, x, y)
@@ -40,6 +40,63 @@ module Squib
40
40
  end
41
41
  end
42
42
 
43
+ # Lays out the cards in range and renders a stitched PNG sheet
44
+ #
45
+ # @example
46
+ # save_png_sheet prefix: 'sheet_', margin: 75, gap: 5, trim: 37
47
+ #
48
+ # @option opts [Enumerable] range (:all) the range of cards over which this will be rendered. See {file:README.md#Specifying_Ranges Specifying Ranges}
49
+ # @option opts colulmns [Integer] (1) the number of columns in the grid
50
+ # @option opts rows [Integer] (:infinite) the number of rows in the grid. When set to :infinite, the sheet scales to the rows needed. If there are more cards than rows*columns, new sheets are started.
51
+ # @option opts [String] prefix (card_) the prefix of the file name(s)
52
+ # @option opts dir [String] (_output) the directory to save to. Created if it doesn't exist.
53
+ # @option opts margin [Integer] (0) the margin around the outside of the page
54
+ # @option opts gap [Integer] (0) the space in pixels between the cards
55
+ # @option opts trim [Integer] (0) the space around the edge of each card to trim (e.g. to cut off the bleed margin for print-and-play)
56
+ # @return [nil]
57
+ # @api public
58
+ def save_sheet(opts = {})
59
+ opts = {margin: 0}.merge(opts) # overriding the non-system default
60
+ p = needs(opts, [:range, :prefix, :creatable_dir, :margin, :gap, :trim, :rows, :columns])
61
+ # EXTRACT METHOD HERE
62
+ sheet_width = (p[:columns] * (@width + 2 * p[:gap] - 2 * p[:trim])) + (2 * p[:margin])
63
+ sheet_height = (p[:rows] * (@height + 2 * p[:gap] - 2 * p[:trim])) + (2 * p[:margin])
64
+ cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height))
65
+ num_this_sheet = 0
66
+ sheet_num = 0
67
+ x, y = p[:margin], p[:margin]
68
+ @progress_bar.start("Saving PNG sheet to #{p[:dir]}/#{p[:prefix]}_*", @cards.size + 1) do |bar|
69
+ p[:range].each do |i|
70
+ if num_this_sheet >= (p[:columns] * p[:rows]) # new sheet
71
+ cc.target.write_to_png("#{p[:dir]}/#{p[:prefix]}#{sheet_num}.png")
72
+ new_sheet = false
73
+ num_this_sheet = 0
74
+ sheet_num += 1
75
+ x, y = p[:margin], p[:margin]
76
+ cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height))
77
+ end
78
+ surface = trim(@cards[i].cairo_surface, p[:trim], @width, @height)
79
+ cc.set_source(surface, x, y)
80
+ cc.paint
81
+ bar.increment
82
+ num_this_sheet += 1
83
+ x += surface.width + p[:gap]
84
+ if num_this_sheet % p[:columns] == 0 # new row
85
+ x = p[:margin]
86
+ y += surface.height + p[:gap]
87
+ end
88
+ bar.increment
89
+ end
90
+ cc.target.write_to_png("#{p[:dir]}/#{p[:prefix]}#{sheet_num}.png")
91
+ end
92
+ end
93
+
94
+ # Return a new Cairo::ImageSurface that is trimmed from the original
95
+ #
96
+ # @param surface The surface to trim
97
+ # @param trim The number of pixels around the edge to trim
98
+ # @param width The width of the surface prior to the trim
99
+ # @param height The height of the surface prior to the trim
43
100
  # :nodoc:
44
101
  # @api private
45
102
  def trim(surface, trim, width, height)
@@ -27,6 +27,8 @@ module Squib
27
27
  opts = svgidify(opts) if params.include? :svgid
28
28
  opts = formatify(opts) if params.include? :formats
29
29
  opts = rotateify(opts) if params.include? :rotate
30
+ opts = rowify(opts) if params.include? :rows
31
+ opts = convert_units(opts, params)
30
32
  opts
31
33
  end
32
34
  module_function :needs
@@ -188,7 +190,40 @@ module Squib
188
190
  Squib.logger.debug {"After rotateify: #{opts}"}
189
191
  opts
190
192
  end
191
- module_function :svgidify
193
+ module_function :rotateify
194
+
195
+ # Convert units
196
+ # :nodoc:
197
+ # @api private
198
+ def convert_units(opts, needed_params)
199
+ Squib::UNIT_CONVERSION_PARAMS.each_pair do |param_name, api_param|
200
+ if needed_params.include? param_name
201
+ opts[api_param].each_with_index do |arg, i|
202
+ case arg.to_s.rstrip
203
+ when /in$/ #ends with "in"
204
+ opts[api_param][i] = arg.rstrip[0..-2].to_f * @dpi
205
+ when /cm$/ #ends with "cm"
206
+ opts[api_param][i] = arg.rstrip[0..-2].to_f * @dpi * Squib::INCHES_IN_CM
207
+ end
208
+ end
209
+ end
210
+ end
211
+ Squib.logger.debug {"After convert_units: #{opts}"}
212
+ return opts
213
+ end
214
+ module_function :convert_units
215
+
216
+ # Handles expanding rows. If the "rows" does not respond to to_i (e.g. :infinite),
217
+ # then compute what we need based on number of cards and number of columns.
218
+ # :nodoc:
219
+ # @api private
220
+ def rowify(opts)
221
+ unless opts[:rows].respond_to? :to_i
222
+ raise "Columns must be an integer" unless opts[:columns].respond_to? :to_i
223
+ opts[:rows] = (@cards.size / opts[:columns].to_i).ceil
224
+ end
225
+ opts
226
+ end
192
227
 
193
228
  end
194
229
  end
data/lib/squib/version.rb CHANGED
@@ -6,5 +6,5 @@ module Squib
6
6
  # Most of the time this is in the alpha of the next release.
7
7
  # e.g. v0.0.5a is on its way to becoming v0.0.5
8
8
  #
9
- VERSION = '0.0.6'
9
+ VERSION = '0.1.0'
10
10
  end
@@ -4,11 +4,13 @@ Squib::Deck.new(width: 825, height: 1125, cards: 1) do
4
4
  background color: '#0b7c8e'
5
5
  rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38
6
6
 
7
- png file: 'shiny-purse.png', x: 620, y: 75
7
+ png file: 'shiny-purse.png', x: 620, y: 75 # no scaling is done by default
8
8
  svg file: 'spanner.svg', x: 620, y: 218
9
9
 
10
- # SVGs can be scaled too
10
+ # Can be scaled if width and height are set
11
11
  svg file: 'spanner.svg', x: 50, y: 50, width: 250, height: 250
12
+ png file: 'shiny-purse.png', x: 305, y: 50, width: 250, height: 250
13
+ #...but PNGs will warn if it's an upscale
12
14
 
13
15
  # We can also limit our rendering to a single object, if the SVG ID is set
14
16
  # Squib prepends a #-sign if one is not specified
data/samples/saves.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'squib'
2
+
3
+ # This sample demonstrates how to use the various save methods
4
+
5
+ Squib::Deck.new(width: 825, height: 1125, cards: 16) do
6
+ background color: :gray
7
+ rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38
8
+
9
+ text str: (1..16).to_a, x: 220, y: 78, font: 'Arial 54'
10
+
11
+ # Place on multiple pages over the PDF, with bleed beeing trimmed off
12
+ save_pdf file: 'save-pdf.pdf', margin: 75, gap: 5, trim: 37
13
+
14
+ # Note that our PNGs still are not trimmed even though the pdf ones were
15
+ save_png range: 1, prefix: 'saves_notrim_'
16
+
17
+ # We can also save our PNGs into a single sheet,
18
+ # rows are calculated based on cols and number of cards
19
+ save_sheet prefix: 'save_single_sheet_',
20
+ columns: 2, margin: 75, gap: 5, trim: 37
21
+
22
+ # Or multiple sheets if rows are also specified
23
+ save_sheet prefix: 'save_sheet_',
24
+ columns: 4, rows: 2,
25
+ margin: 75, gap: 5, trim: 37
26
+
27
+ # Sheets support ranges too
28
+ save_sheet prefix: 'save_sheet_range_',
29
+ range: 0..5,
30
+ columns: 2, rows: 2,
31
+ margin: 75, gap: 5, trim: 37
32
+ end
@@ -14,8 +14,6 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
14
14
  text str: data['name'], x: 250, y: 55, font: 'Arial weight=900 54'
15
15
  text str: data['level'], x: 65, y: 40, font: 'Arial 72', color: :burnt_orange
16
16
 
17
- text str: "UTF-8 \u2663", x: 565, y: 150, font: 'Arial weight=900 36'
18
-
19
17
  text str: 'Font strings are expressive!', x:65, y: 200,
20
18
  font: 'Impact bold italic 36'
21
19
 
@@ -0,0 +1,27 @@
1
+ require 'squib'
2
+
3
+ # Here's a handy list of game-related UTF-8 characters
4
+ # for those early pre-graphics prototypes
5
+ game_chars = %W(\u2620 \u2622 \u2623 \u00AB \u00BB \u2039 \u203A \u2022 \u20D8 \u20D9 \u20DA \u2023 \u20E1 \u20D4 \u20D5 \u20D6 \u20D7 \u2190 \u2191 \u2192 \u2193 \u2194 \u2196 \u2197 \u2198 \u2199 \u219A \u219B \u219C \u219D \u219E \u219F \u21A0 \u21A1 \u21A2 \u21A3 \u21A4 \u21A5 \u21A6 \u21A7 \u21A8 \u21A9 \u21AA \u21AB \u21AC \u21AD \u21AE \u21AF \u21B0 \u21B1 \u21B2 \u21B3 \u21B4 \u21B5 \u21B6 \u21B7 \u21B8 \u21B9 \u21BA \u21BB \u21C4 \u21C5 \u21C6 \u21C7 \u21C8 \u21C9 \u21CA \u21CD \u21CE \u21CF \u21D0 \u21D1 \u21D2 \u21D3 \u21D4 \u21D5 \u21D6 \u21D7 \u21D8 \u21D9 \u21DA \u21DB \u21DC \u21DD \u21DC \u21E0 \u21E1 \u21E2 \u21E3 \u21E4 \u21E5 \u21E6 \u21E7 \u21E8 \u21E9 \u21EA \u20DE \u20DD \u20DF \u20E0 \u2205 \u220E \u2234 \u2295 \u2296 \u2297 \u2298 \u2349 \u2299 \u229A \u229E \u22B9 \u2302 \u2316 \u231A \u231B \u2326 \u232B \u2327 \u2331 \u2460 \u2461 \u2462 \u2463 \u2464 \u2465 \u2466 \u2467 \u2468 \u2469 \u246A \u246B \u246C \u246D \u246E \u246F \u2470 \u2471 \u2472 \u2473 \u2600 \u2601 \u2602 \u2603 \u2604 \u2605 \u2606 \u2607 \u260E \u2611 \u261A \u261B \u261C \u261D \u261E \u261F \u2624 \u262E \u262F \u2639 \u263A \u2654 \u2655 \u2656 \u2657 \u2658 \u2659 \u265A \u265B \u265C \u265D \u265E \u265F \u2660 \u2661 \u2662 \u2663 \u2664 \u2665 \u2666 \u2667 \u2668 \u2690 \u2691 \u2692 \u2693 \u2694 \u2696 \u2699 \u269B \u26A0 \u26A1 \u26BD \u26BE \u26C4 \u26C5 \u26D4 \u26EA \u26F2 \u26F3 \u26F5 \u26FA \u26FD \u2707 \u270A \u270B \u270C \u2713 \u2714 \u271C \u27F2 \u27F3 \u27F4 \u2B1B \u2B1C \u1F601 \u00BD \u00BE \u00BC \u2153 \u2154 \u2155 \u2156 \u2157 )
6
+
7
+ cell_height = 80
8
+ cell_width = 400
9
+ cols = 7
10
+ x, y = 1, 80
11
+ Squib::Deck.new(height: (game_chars.size / cols + 1) * cell_height,
12
+ width: cell_width * cols) do
13
+ background color: :white
14
+ text str: 'Game-related UTF8 icons. Generated by Squib, https://github.com/andymeneely/squib'
15
+ game_chars.each_with_index do |c, i|
16
+ rect fill_color: %w(#eeee #ffff)[i % 2],
17
+ width: cell_width, height: cell_height, x: x, y: y
18
+ text str: c.inspect, font: 'Sans 42', x: x, y: y
19
+ text str: c, font: 'Sans,Segoe UI Symbol 42', x: x + 300, y: y
20
+ x += cell_width
21
+ if i % cols == cols - 1
22
+ x = 1
23
+ y += cell_height if i % cols == cols - 1
24
+ end
25
+ end
26
+ save_png prefix: 'unicode_'
27
+ end
data/samples/units.rb CHANGED
@@ -1,12 +1,28 @@
1
1
  require 'squib'
2
2
 
3
- Squib::Deck.new(width: 825, height: 1125) do
4
- background color: :white
3
+ Squib::Deck.new do
4
+ background color: '#ddd'
5
5
 
6
- bleed = inches(0.125)
7
- cut_width = inches(2.5)
6
+ # We can use our DSL-method to use inches
7
+ # Computed using @dpi (set to 300 by default)
8
+ bleed = inches(0.125)
9
+ cut_width = inches(2.5)
8
10
  cut_height = inches(3.5)
9
- rect x: bleed, y: bleed, width: cut_width, height: cut_height, radius: 25
11
+ rect x: bleed, y: bleed, radius: 25,
12
+ width: cut_width, height: cut_height
13
+
14
+ # We can also use cm this way
15
+ cm(2)
16
+
17
+ # Or we can use a string ending with cm or in
18
+ # (even cleaner in Yaml since we don't need quotes!)
19
+ safe_margin = '0.25in'
20
+ safe_width = '2.25in'
21
+ safe_height = '3.25in'
22
+ rect x: safe_margin, y: safe_margin,
23
+ width: safe_width, height: safe_height, radius: 25
24
+
25
+ rect x: '4cm', y: '4 cm ', width: 100, height: 100
10
26
 
11
27
  save prefix: 'units_', format: :png
12
28
  end
@@ -7,7 +7,7 @@ describe Squib::Deck, 'images' do
7
7
  it 'calls Card#png, Dir, and progress bar' do
8
8
  card = instance_double(Squib::Card)
9
9
  progress = double(Squib::Progress)
10
- expect(card).to receive(:png).with('foo', 0, 1, 0.5, :overlay, 0.75).once
10
+ expect(card).to receive(:png).with('foo', 0, 1, :native, :native, 0.5, :overlay, 0.75).once
11
11
  expect(Dir).to receive(:chdir).with('.').and_yield.once
12
12
  expect(progress).to receive(:start).and_yield(progress).once
13
13
  expect(progress).to receive(:increment).once
@@ -0,0 +1 @@
1
+ empty: #no rules actually set
@@ -0,0 +1 @@
1
+ # testing for an empty yaml file here
@@ -36,6 +36,14 @@ cairo: translate([-50, -50])
36
36
  cairo: set_source([MockDouble, 50, 50])
37
37
  cairo: paint([1.0])
38
38
  cairo: restore([])
39
+ cairo: save([])
40
+ cairo: translate([305, 50])
41
+ cairo: scale([1.953125, 1.953125])
42
+ cairo: rotate([0])
43
+ cairo: translate([-305, -50])
44
+ cairo: set_source([ImageSurface, 305, 50])
45
+ cairo: paint([1.0])
46
+ cairo: restore([])
39
47
  cairo: scale([0.5859375, 0.5859375])
40
48
  cairo: render_rsvg_handle([RSVG::Handle, "#backdrop"])
41
49
  cairo: save([])
@@ -0,0 +1,702 @@
1
+ cairo: save([])
2
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
3
+ cairo: paint([])
4
+ cairo: restore([])
5
+ cairo: save([])
6
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
7
+ cairo: paint([])
8
+ cairo: restore([])
9
+ cairo: save([])
10
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
11
+ cairo: paint([])
12
+ cairo: restore([])
13
+ cairo: save([])
14
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
15
+ cairo: paint([])
16
+ cairo: restore([])
17
+ cairo: save([])
18
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
19
+ cairo: paint([])
20
+ cairo: restore([])
21
+ cairo: save([])
22
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
23
+ cairo: paint([])
24
+ cairo: restore([])
25
+ cairo: save([])
26
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
27
+ cairo: paint([])
28
+ cairo: restore([])
29
+ cairo: save([])
30
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
31
+ cairo: paint([])
32
+ cairo: restore([])
33
+ cairo: save([])
34
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
35
+ cairo: paint([])
36
+ cairo: restore([])
37
+ cairo: save([])
38
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
39
+ cairo: paint([])
40
+ cairo: restore([])
41
+ cairo: save([])
42
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
43
+ cairo: paint([])
44
+ cairo: restore([])
45
+ cairo: save([])
46
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
47
+ cairo: paint([])
48
+ cairo: restore([])
49
+ cairo: save([])
50
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
51
+ cairo: paint([])
52
+ cairo: restore([])
53
+ cairo: save([])
54
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
55
+ cairo: paint([])
56
+ cairo: restore([])
57
+ cairo: save([])
58
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
59
+ cairo: paint([])
60
+ cairo: restore([])
61
+ cairo: save([])
62
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.501960784313725, @green=0.501960784313725, @blue=0.501960784313725>])
63
+ cairo: paint([])
64
+ cairo: restore([])
65
+ cairo: save([])
66
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
67
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
68
+ cairo: set_line_width([2.0])
69
+ cairo: stroke([])
70
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
71
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
72
+ cairo: fill([])
73
+ cairo: restore([])
74
+ cairo: save([])
75
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
76
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
77
+ cairo: set_line_width([2.0])
78
+ cairo: stroke([])
79
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
80
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
81
+ cairo: fill([])
82
+ cairo: restore([])
83
+ cairo: save([])
84
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
85
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
86
+ cairo: set_line_width([2.0])
87
+ cairo: stroke([])
88
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
89
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
90
+ cairo: fill([])
91
+ cairo: restore([])
92
+ cairo: save([])
93
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
94
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
95
+ cairo: set_line_width([2.0])
96
+ cairo: stroke([])
97
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
98
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
99
+ cairo: fill([])
100
+ cairo: restore([])
101
+ cairo: save([])
102
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
103
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
104
+ cairo: set_line_width([2.0])
105
+ cairo: stroke([])
106
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
107
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
108
+ cairo: fill([])
109
+ cairo: restore([])
110
+ cairo: save([])
111
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
112
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
113
+ cairo: set_line_width([2.0])
114
+ cairo: stroke([])
115
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
116
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
117
+ cairo: fill([])
118
+ cairo: restore([])
119
+ cairo: save([])
120
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
121
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
122
+ cairo: set_line_width([2.0])
123
+ cairo: stroke([])
124
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
125
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
126
+ cairo: fill([])
127
+ cairo: restore([])
128
+ cairo: save([])
129
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
130
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
131
+ cairo: set_line_width([2.0])
132
+ cairo: stroke([])
133
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
134
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
135
+ cairo: fill([])
136
+ cairo: restore([])
137
+ cairo: save([])
138
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
139
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
140
+ cairo: set_line_width([2.0])
141
+ cairo: stroke([])
142
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
143
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
144
+ cairo: fill([])
145
+ cairo: restore([])
146
+ cairo: save([])
147
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
148
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
149
+ cairo: set_line_width([2.0])
150
+ cairo: stroke([])
151
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
152
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
153
+ cairo: fill([])
154
+ cairo: restore([])
155
+ cairo: save([])
156
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
157
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
158
+ cairo: set_line_width([2.0])
159
+ cairo: stroke([])
160
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
161
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
162
+ cairo: fill([])
163
+ cairo: restore([])
164
+ cairo: save([])
165
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
166
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
167
+ cairo: set_line_width([2.0])
168
+ cairo: stroke([])
169
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
170
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
171
+ cairo: fill([])
172
+ cairo: restore([])
173
+ cairo: save([])
174
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
175
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
176
+ cairo: set_line_width([2.0])
177
+ cairo: stroke([])
178
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
179
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
180
+ cairo: fill([])
181
+ cairo: restore([])
182
+ cairo: save([])
183
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
184
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
185
+ cairo: set_line_width([2.0])
186
+ cairo: stroke([])
187
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
188
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
189
+ cairo: fill([])
190
+ cairo: restore([])
191
+ cairo: save([])
192
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
193
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
194
+ cairo: set_line_width([2.0])
195
+ cairo: stroke([])
196
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
197
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
198
+ cairo: fill([])
199
+ cairo: restore([])
200
+ cairo: save([])
201
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
202
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
203
+ cairo: set_line_width([2.0])
204
+ cairo: stroke([])
205
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
206
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
207
+ cairo: fill([])
208
+ cairo: restore([])
209
+ cairo: save([])
210
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
211
+ cairo: translate([220, 78])
212
+ cairo: rotate([0])
213
+ cairo: translate([-220, -78])
214
+ cairo: move_to([220, 78])
215
+ pango: font_description=([])
216
+ pango: text=(["1"])
217
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
218
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
219
+ pango: alignment=([#<Pango::Layout::Alignment left>])
220
+ pango: justify=([false])
221
+ pango: spacing=([0])
222
+ cairo: update_pango_layout([MockDouble])
223
+ cairo: update_pango_layout([MockDouble])
224
+ cairo: show_pango_layout([MockDouble])
225
+ cairo: restore([])
226
+ cairo: save([])
227
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
228
+ cairo: translate([220, 78])
229
+ cairo: rotate([0])
230
+ cairo: translate([-220, -78])
231
+ cairo: move_to([220, 78])
232
+ pango: font_description=([])
233
+ pango: text=(["2"])
234
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
235
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
236
+ pango: alignment=([#<Pango::Layout::Alignment left>])
237
+ pango: justify=([false])
238
+ pango: spacing=([0])
239
+ cairo: update_pango_layout([MockDouble])
240
+ cairo: update_pango_layout([MockDouble])
241
+ cairo: show_pango_layout([MockDouble])
242
+ cairo: restore([])
243
+ cairo: save([])
244
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
245
+ cairo: translate([220, 78])
246
+ cairo: rotate([0])
247
+ cairo: translate([-220, -78])
248
+ cairo: move_to([220, 78])
249
+ pango: font_description=([])
250
+ pango: text=(["3"])
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: update_pango_layout([MockDouble])
258
+ cairo: show_pango_layout([MockDouble])
259
+ cairo: restore([])
260
+ cairo: save([])
261
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
262
+ cairo: translate([220, 78])
263
+ cairo: rotate([0])
264
+ cairo: translate([-220, -78])
265
+ cairo: move_to([220, 78])
266
+ pango: font_description=([])
267
+ pango: text=(["4"])
268
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
269
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
270
+ pango: alignment=([#<Pango::Layout::Alignment left>])
271
+ pango: justify=([false])
272
+ pango: spacing=([0])
273
+ cairo: update_pango_layout([MockDouble])
274
+ cairo: update_pango_layout([MockDouble])
275
+ cairo: show_pango_layout([MockDouble])
276
+ cairo: restore([])
277
+ cairo: save([])
278
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
279
+ cairo: translate([220, 78])
280
+ cairo: rotate([0])
281
+ cairo: translate([-220, -78])
282
+ cairo: move_to([220, 78])
283
+ pango: font_description=([])
284
+ pango: text=(["5"])
285
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
286
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
287
+ pango: alignment=([#<Pango::Layout::Alignment left>])
288
+ pango: justify=([false])
289
+ pango: spacing=([0])
290
+ cairo: update_pango_layout([MockDouble])
291
+ cairo: update_pango_layout([MockDouble])
292
+ cairo: show_pango_layout([MockDouble])
293
+ cairo: restore([])
294
+ cairo: save([])
295
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
296
+ cairo: translate([220, 78])
297
+ cairo: rotate([0])
298
+ cairo: translate([-220, -78])
299
+ cairo: move_to([220, 78])
300
+ pango: font_description=([])
301
+ pango: text=(["6"])
302
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
303
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
304
+ pango: alignment=([#<Pango::Layout::Alignment left>])
305
+ pango: justify=([false])
306
+ pango: spacing=([0])
307
+ cairo: update_pango_layout([MockDouble])
308
+ cairo: update_pango_layout([MockDouble])
309
+ cairo: show_pango_layout([MockDouble])
310
+ cairo: restore([])
311
+ cairo: save([])
312
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
313
+ cairo: translate([220, 78])
314
+ cairo: rotate([0])
315
+ cairo: translate([-220, -78])
316
+ cairo: move_to([220, 78])
317
+ pango: font_description=([])
318
+ pango: text=(["7"])
319
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
320
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
321
+ pango: alignment=([#<Pango::Layout::Alignment left>])
322
+ pango: justify=([false])
323
+ pango: spacing=([0])
324
+ cairo: update_pango_layout([MockDouble])
325
+ cairo: update_pango_layout([MockDouble])
326
+ cairo: show_pango_layout([MockDouble])
327
+ cairo: restore([])
328
+ cairo: save([])
329
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
330
+ cairo: translate([220, 78])
331
+ cairo: rotate([0])
332
+ cairo: translate([-220, -78])
333
+ cairo: move_to([220, 78])
334
+ pango: font_description=([])
335
+ pango: text=(["8"])
336
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
337
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
338
+ pango: alignment=([#<Pango::Layout::Alignment left>])
339
+ pango: justify=([false])
340
+ pango: spacing=([0])
341
+ cairo: update_pango_layout([MockDouble])
342
+ cairo: update_pango_layout([MockDouble])
343
+ cairo: show_pango_layout([MockDouble])
344
+ cairo: restore([])
345
+ cairo: save([])
346
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
347
+ cairo: translate([220, 78])
348
+ cairo: rotate([0])
349
+ cairo: translate([-220, -78])
350
+ cairo: move_to([220, 78])
351
+ pango: font_description=([])
352
+ pango: text=(["9"])
353
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
354
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
355
+ pango: alignment=([#<Pango::Layout::Alignment left>])
356
+ pango: justify=([false])
357
+ pango: spacing=([0])
358
+ cairo: update_pango_layout([MockDouble])
359
+ cairo: update_pango_layout([MockDouble])
360
+ cairo: show_pango_layout([MockDouble])
361
+ cairo: restore([])
362
+ cairo: save([])
363
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
364
+ cairo: translate([220, 78])
365
+ cairo: rotate([0])
366
+ cairo: translate([-220, -78])
367
+ cairo: move_to([220, 78])
368
+ pango: font_description=([])
369
+ pango: text=(["10"])
370
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
371
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
372
+ pango: alignment=([#<Pango::Layout::Alignment left>])
373
+ pango: justify=([false])
374
+ pango: spacing=([0])
375
+ cairo: update_pango_layout([MockDouble])
376
+ cairo: update_pango_layout([MockDouble])
377
+ cairo: show_pango_layout([MockDouble])
378
+ cairo: restore([])
379
+ cairo: save([])
380
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
381
+ cairo: translate([220, 78])
382
+ cairo: rotate([0])
383
+ cairo: translate([-220, -78])
384
+ cairo: move_to([220, 78])
385
+ pango: font_description=([])
386
+ pango: text=(["11"])
387
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
388
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
389
+ pango: alignment=([#<Pango::Layout::Alignment left>])
390
+ pango: justify=([false])
391
+ pango: spacing=([0])
392
+ cairo: update_pango_layout([MockDouble])
393
+ cairo: update_pango_layout([MockDouble])
394
+ cairo: show_pango_layout([MockDouble])
395
+ cairo: restore([])
396
+ cairo: save([])
397
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
398
+ cairo: translate([220, 78])
399
+ cairo: rotate([0])
400
+ cairo: translate([-220, -78])
401
+ cairo: move_to([220, 78])
402
+ pango: font_description=([])
403
+ pango: text=(["12"])
404
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
405
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
406
+ pango: alignment=([#<Pango::Layout::Alignment left>])
407
+ pango: justify=([false])
408
+ pango: spacing=([0])
409
+ cairo: update_pango_layout([MockDouble])
410
+ cairo: update_pango_layout([MockDouble])
411
+ cairo: show_pango_layout([MockDouble])
412
+ cairo: restore([])
413
+ cairo: save([])
414
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
415
+ cairo: translate([220, 78])
416
+ cairo: rotate([0])
417
+ cairo: translate([-220, -78])
418
+ cairo: move_to([220, 78])
419
+ pango: font_description=([])
420
+ pango: text=(["13"])
421
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
422
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
423
+ pango: alignment=([#<Pango::Layout::Alignment left>])
424
+ pango: justify=([false])
425
+ pango: spacing=([0])
426
+ cairo: update_pango_layout([MockDouble])
427
+ cairo: update_pango_layout([MockDouble])
428
+ cairo: show_pango_layout([MockDouble])
429
+ cairo: restore([])
430
+ cairo: save([])
431
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
432
+ cairo: translate([220, 78])
433
+ cairo: rotate([0])
434
+ cairo: translate([-220, -78])
435
+ cairo: move_to([220, 78])
436
+ pango: font_description=([])
437
+ pango: text=(["14"])
438
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
439
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
440
+ pango: alignment=([#<Pango::Layout::Alignment left>])
441
+ pango: justify=([false])
442
+ pango: spacing=([0])
443
+ cairo: update_pango_layout([MockDouble])
444
+ cairo: update_pango_layout([MockDouble])
445
+ cairo: show_pango_layout([MockDouble])
446
+ cairo: restore([])
447
+ cairo: save([])
448
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
449
+ cairo: translate([220, 78])
450
+ cairo: rotate([0])
451
+ cairo: translate([-220, -78])
452
+ cairo: move_to([220, 78])
453
+ pango: font_description=([])
454
+ pango: text=(["15"])
455
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
456
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
457
+ pango: alignment=([#<Pango::Layout::Alignment left>])
458
+ pango: justify=([false])
459
+ pango: spacing=([0])
460
+ cairo: update_pango_layout([MockDouble])
461
+ cairo: update_pango_layout([MockDouble])
462
+ cairo: show_pango_layout([MockDouble])
463
+ cairo: restore([])
464
+ cairo: save([])
465
+ cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
466
+ cairo: translate([220, 78])
467
+ cairo: rotate([0])
468
+ cairo: translate([-220, -78])
469
+ cairo: move_to([220, 78])
470
+ pango: font_description=([])
471
+ pango: text=(["16"])
472
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
473
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
474
+ pango: alignment=([#<Pango::Layout::Alignment left>])
475
+ pango: justify=([false])
476
+ pango: spacing=([0])
477
+ cairo: update_pango_layout([MockDouble])
478
+ cairo: update_pango_layout([MockDouble])
479
+ cairo: show_pango_layout([MockDouble])
480
+ cairo: restore([])
481
+ cairo: set_source([MockDouble, -37, -37])
482
+ cairo: paint([])
483
+ cairo: set_source([MockDouble, 75, 75])
484
+ cairo: paint([])
485
+ cairo: set_source([MockDouble, -37, -37])
486
+ cairo: paint([])
487
+ cairo: set_source([MockDouble, 180, 75])
488
+ cairo: paint([])
489
+ cairo: set_source([MockDouble, -37, -37])
490
+ cairo: paint([])
491
+ cairo: set_source([MockDouble, 285, 75])
492
+ cairo: paint([])
493
+ cairo: set_source([MockDouble, -37, -37])
494
+ cairo: paint([])
495
+ cairo: set_source([MockDouble, 390, 75])
496
+ cairo: paint([])
497
+ cairo: set_source([MockDouble, -37, -37])
498
+ cairo: paint([])
499
+ cairo: set_source([MockDouble, 495, 75])
500
+ cairo: paint([])
501
+ cairo: set_source([MockDouble, -37, -37])
502
+ cairo: paint([])
503
+ cairo: set_source([MockDouble, 600, 75])
504
+ cairo: paint([])
505
+ cairo: set_source([MockDouble, -37, -37])
506
+ cairo: paint([])
507
+ cairo: set_source([MockDouble, 705, 75])
508
+ cairo: paint([])
509
+ cairo: set_source([MockDouble, -37, -37])
510
+ cairo: paint([])
511
+ cairo: set_source([MockDouble, 810, 75])
512
+ cairo: paint([])
513
+ cairo: set_source([MockDouble, -37, -37])
514
+ cairo: paint([])
515
+ cairo: set_source([MockDouble, 915, 75])
516
+ cairo: paint([])
517
+ cairo: set_source([MockDouble, -37, -37])
518
+ cairo: paint([])
519
+ cairo: set_source([MockDouble, 1020, 75])
520
+ cairo: paint([])
521
+ cairo: set_source([MockDouble, -37, -37])
522
+ cairo: paint([])
523
+ cairo: set_source([MockDouble, 1125, 75])
524
+ cairo: paint([])
525
+ cairo: set_source([MockDouble, -37, -37])
526
+ cairo: paint([])
527
+ cairo: set_source([MockDouble, 1230, 75])
528
+ cairo: paint([])
529
+ cairo: set_source([MockDouble, -37, -37])
530
+ cairo: paint([])
531
+ cairo: set_source([MockDouble, 1335, 75])
532
+ cairo: paint([])
533
+ cairo: set_source([MockDouble, -37, -37])
534
+ cairo: paint([])
535
+ cairo: set_source([MockDouble, 1440, 75])
536
+ cairo: paint([])
537
+ cairo: set_source([MockDouble, -37, -37])
538
+ cairo: paint([])
539
+ cairo: set_source([MockDouble, 1545, 75])
540
+ cairo: paint([])
541
+ cairo: set_source([MockDouble, -37, -37])
542
+ cairo: paint([])
543
+ cairo: set_source([MockDouble, 1650, 75])
544
+ cairo: paint([])
545
+ surface: write_to_png(["_output/saves_notrim_1.png"])
546
+ cairo: set_source([MockDouble, -37, -37])
547
+ cairo: paint([])
548
+ cairo: set_source([MockDouble, 75, 75])
549
+ cairo: paint([])
550
+ cairo: set_source([MockDouble, -37, -37])
551
+ cairo: paint([])
552
+ cairo: set_source([MockDouble, 180, 75])
553
+ cairo: paint([])
554
+ cairo: set_source([MockDouble, -37, -37])
555
+ cairo: paint([])
556
+ cairo: set_source([MockDouble, 75, 181])
557
+ cairo: paint([])
558
+ cairo: set_source([MockDouble, -37, -37])
559
+ cairo: paint([])
560
+ cairo: set_source([MockDouble, 180, 181])
561
+ cairo: paint([])
562
+ cairo: set_source([MockDouble, -37, -37])
563
+ cairo: paint([])
564
+ cairo: set_source([MockDouble, 75, 287])
565
+ cairo: paint([])
566
+ cairo: set_source([MockDouble, -37, -37])
567
+ cairo: paint([])
568
+ cairo: set_source([MockDouble, 180, 287])
569
+ cairo: paint([])
570
+ cairo: set_source([MockDouble, -37, -37])
571
+ cairo: paint([])
572
+ cairo: set_source([MockDouble, 75, 393])
573
+ cairo: paint([])
574
+ cairo: set_source([MockDouble, -37, -37])
575
+ cairo: paint([])
576
+ cairo: set_source([MockDouble, 180, 393])
577
+ cairo: paint([])
578
+ cairo: set_source([MockDouble, -37, -37])
579
+ cairo: paint([])
580
+ cairo: set_source([MockDouble, 75, 499])
581
+ cairo: paint([])
582
+ cairo: set_source([MockDouble, -37, -37])
583
+ cairo: paint([])
584
+ cairo: set_source([MockDouble, 180, 499])
585
+ cairo: paint([])
586
+ cairo: set_source([MockDouble, -37, -37])
587
+ cairo: paint([])
588
+ cairo: set_source([MockDouble, 75, 605])
589
+ cairo: paint([])
590
+ cairo: set_source([MockDouble, -37, -37])
591
+ cairo: paint([])
592
+ cairo: set_source([MockDouble, 180, 605])
593
+ cairo: paint([])
594
+ cairo: set_source([MockDouble, -37, -37])
595
+ cairo: paint([])
596
+ cairo: set_source([MockDouble, 75, 711])
597
+ cairo: paint([])
598
+ cairo: set_source([MockDouble, -37, -37])
599
+ cairo: paint([])
600
+ cairo: set_source([MockDouble, 180, 711])
601
+ cairo: paint([])
602
+ cairo: set_source([MockDouble, -37, -37])
603
+ cairo: paint([])
604
+ cairo: set_source([MockDouble, 75, 817])
605
+ cairo: paint([])
606
+ cairo: set_source([MockDouble, -37, -37])
607
+ cairo: paint([])
608
+ cairo: set_source([MockDouble, 180, 817])
609
+ cairo: paint([])
610
+ surface: write_to_png(["_output/save_single_sheet_0.png"])
611
+ cairo: set_source([MockDouble, -37, -37])
612
+ cairo: paint([])
613
+ cairo: set_source([MockDouble, 75, 75])
614
+ cairo: paint([])
615
+ cairo: set_source([MockDouble, -37, -37])
616
+ cairo: paint([])
617
+ cairo: set_source([MockDouble, 180, 75])
618
+ cairo: paint([])
619
+ cairo: set_source([MockDouble, -37, -37])
620
+ cairo: paint([])
621
+ cairo: set_source([MockDouble, 285, 75])
622
+ cairo: paint([])
623
+ cairo: set_source([MockDouble, -37, -37])
624
+ cairo: paint([])
625
+ cairo: set_source([MockDouble, 390, 75])
626
+ cairo: paint([])
627
+ cairo: set_source([MockDouble, -37, -37])
628
+ cairo: paint([])
629
+ cairo: set_source([MockDouble, 75, 181])
630
+ cairo: paint([])
631
+ cairo: set_source([MockDouble, -37, -37])
632
+ cairo: paint([])
633
+ cairo: set_source([MockDouble, 180, 181])
634
+ cairo: paint([])
635
+ cairo: set_source([MockDouble, -37, -37])
636
+ cairo: paint([])
637
+ cairo: set_source([MockDouble, 285, 181])
638
+ cairo: paint([])
639
+ cairo: set_source([MockDouble, -37, -37])
640
+ cairo: paint([])
641
+ cairo: set_source([MockDouble, 390, 181])
642
+ cairo: paint([])
643
+ surface: write_to_png(["_output/save_sheet_0.png"])
644
+ cairo: set_source([MockDouble, -37, -37])
645
+ cairo: paint([])
646
+ cairo: set_source([MockDouble, 75, 75])
647
+ cairo: paint([])
648
+ cairo: set_source([MockDouble, -37, -37])
649
+ cairo: paint([])
650
+ cairo: set_source([MockDouble, 180, 75])
651
+ cairo: paint([])
652
+ cairo: set_source([MockDouble, -37, -37])
653
+ cairo: paint([])
654
+ cairo: set_source([MockDouble, 285, 75])
655
+ cairo: paint([])
656
+ cairo: set_source([MockDouble, -37, -37])
657
+ cairo: paint([])
658
+ cairo: set_source([MockDouble, 390, 75])
659
+ cairo: paint([])
660
+ cairo: set_source([MockDouble, -37, -37])
661
+ cairo: paint([])
662
+ cairo: set_source([MockDouble, 75, 181])
663
+ cairo: paint([])
664
+ cairo: set_source([MockDouble, -37, -37])
665
+ cairo: paint([])
666
+ cairo: set_source([MockDouble, 180, 181])
667
+ cairo: paint([])
668
+ cairo: set_source([MockDouble, -37, -37])
669
+ cairo: paint([])
670
+ cairo: set_source([MockDouble, 285, 181])
671
+ cairo: paint([])
672
+ cairo: set_source([MockDouble, -37, -37])
673
+ cairo: paint([])
674
+ cairo: set_source([MockDouble, 390, 181])
675
+ cairo: paint([])
676
+ surface: write_to_png(["_output/save_sheet_1.png"])
677
+ cairo: set_source([MockDouble, -37, -37])
678
+ cairo: paint([])
679
+ cairo: set_source([MockDouble, 75, 75])
680
+ cairo: paint([])
681
+ cairo: set_source([MockDouble, -37, -37])
682
+ cairo: paint([])
683
+ cairo: set_source([MockDouble, 180, 75])
684
+ cairo: paint([])
685
+ cairo: set_source([MockDouble, -37, -37])
686
+ cairo: paint([])
687
+ cairo: set_source([MockDouble, 75, 181])
688
+ cairo: paint([])
689
+ cairo: set_source([MockDouble, -37, -37])
690
+ cairo: paint([])
691
+ cairo: set_source([MockDouble, 180, 181])
692
+ cairo: paint([])
693
+ surface: write_to_png(["_output/save_sheet_range_0.png"])
694
+ cairo: set_source([MockDouble, -37, -37])
695
+ cairo: paint([])
696
+ cairo: set_source([MockDouble, 75, 75])
697
+ cairo: paint([])
698
+ cairo: set_source([MockDouble, -37, -37])
699
+ cairo: paint([])
700
+ cairo: set_source([MockDouble, 180, 75])
701
+ cairo: paint([])
702
+ surface: write_to_png(["_output/save_sheet_range_1.png"])