diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ac812b..9ad10ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ # Squib CHANGELOG +## v0.1.0.txt +* Added `save_sheet` command that saves a range into PNG sheets, complete with trim, gap, margin, columns, and sometimes automagically computed rows. See samples/saves.rb. * Unit conversion! Now you can write "2in" and it will convert based on the current dpi. `save_pdf` not supported (yet). * `png` now supports resizing, but warns you about it since it's non-ideal. Documented in yard, tested. * Added sample `unicode.rb` to show lots of game-related unicode characters +* More obsessive automated testing and continuous integration work. ## v0.0.6 * Added a `csv` command that works just like `xslx`. Uses Ruby's CSV inside, with some extra checking and warnings. diff --git a/lib/squib/api/shapes.rb b/lib/squib/api/shapes.rb index 9650b18..e7896ea 100644 --- a/lib/squib/api/shapes.rb +++ b/lib/squib/api/shapes.rb @@ -50,7 +50,7 @@ module Squib # @return [nil] intended to be void # @api public def circle(opts = {}) - opts = {radius: 100}.merge(opts) + opts = {radius: 100}.merge(opts) # overriding the non-system default opts = needs(opts, [:range, :x, :y, :circle_radius, :layout, :fill_color, :stroke_color, :stroke_width]) opts[:range].each do |i| diff --git a/lib/squib/constants.rb b/lib/squib/constants.rb index 717f861..a429753 100644 --- a/lib/squib/constants.rb +++ b/lib/squib/constants.rb @@ -8,6 +8,7 @@ module Squib :angle => 0, :blend => :none, :color => :black, + :columns => 1, :default_font => 'Arial 36', :dir => '_output', :ellipsize => :end, @@ -27,6 +28,7 @@ module Squib :progress_bar => false, :range => :all, :rotate => false, + :rows => :infinite, :sheet => 0, :spacing => 0, :str => '', @@ -62,7 +64,7 @@ module Squib # These are parameters that are intended to be "expanded" across # range if they are singletons. # - # For example, using a different font for each card, using one `text` + # For example: using a different font for each card, using one `text` command # # key: the internal name of the param (e.g. :files) # value: the user-facing API key (e.g. file: 'abc.png') diff --git a/lib/squib/graphics/save_doc.rb b/lib/squib/graphics/save_doc.rb index bf3cf65..a6cb6ec 100644 --- a/lib/squib/graphics/save_doc.rb +++ b/lib/squib/graphics/save_doc.rb @@ -40,6 +40,63 @@ module Squib end end + # Lays out the cards in range and renders a stitched PNG sheet + # + # @example + # save_png_sheet prefix: 'sheet_', margin: 75, gap: 5, trim: 37 + # + # @option opts [Enumerable] range (:all) the range of cards over which this will be rendered. See {file:README.md#Specifying_Ranges Specifying Ranges} + # @option opts colulmns [Integer] (1) the number of columns in the grid + # @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. + # @option opts [String] prefix (card_) the prefix of the file name(s) + # @option opts dir [String] (_output) the directory to save to. Created if it doesn't exist. + # @option opts margin [Integer] (0) the margin around the outside of the page + # @option opts gap [Integer] (0) the space in pixels between the cards + # @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) + # @return [nil] + # @api public + def save_sheet(opts = {}) + opts = {margin: 0}.merge(opts) # overriding the non-system default + p = needs(opts, [:range, :prefix, :creatable_dir, :margin, :gap, :trim, :rows, :columns]) + # EXTRACT METHOD HERE + sheet_width = (p[:columns] * (@width + 2 * p[:gap] - 2 * p[:trim])) + (2 * p[:margin]) + sheet_height = (p[:rows] * (@height + 2 * p[:gap] - 2 * p[:trim])) + (2 * p[:margin]) + cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height)) + num_this_sheet = 0 + sheet_num = 0 + x, y = p[:margin], p[:margin] + @progress_bar.start("Saving PNG sheet to #{p[:dir]}/#{p[:prefix]}_*", @cards.size + 1) do |bar| + p[:range].each do |i| + if num_this_sheet >= (p[:columns] * p[:rows]) # new sheet + cc.target.write_to_png("#{p[:dir]}/#{p[:prefix]}#{sheet_num}.png") + new_sheet = false + num_this_sheet = 0 + sheet_num += 1 + x, y = p[:margin], p[:margin] + cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height)) + end + surface = trim(@cards[i].cairo_surface, p[:trim], @width, @height) + cc.set_source(surface, x, y) + cc.paint + bar.increment + num_this_sheet += 1 + x += surface.width + p[:gap] + if num_this_sheet % p[:columns] == 0 # new row + x = p[:margin] + y += surface.height + p[:gap] + end + bar.increment + end + cc.target.write_to_png("#{p[:dir]}/#{p[:prefix]}#{sheet_num}.png") + end + end + + # Return a new Cairo::ImageSurface that is trimmed from the original + # + # @param surface The surface to trim + # @param trim The number of pixels around the edge to trim + # @width width The width of the surface prior to the trim + # @height height The height of the surface prior to the trim # :nodoc: # @api private def trim(surface, trim, width, height) diff --git a/lib/squib/input_helpers.rb b/lib/squib/input_helpers.rb index c2da542..298bccc 100644 --- a/lib/squib/input_helpers.rb +++ b/lib/squib/input_helpers.rb @@ -1,5 +1,4 @@ require 'squib/constants' -require 'squib/api/units' module Squib # :nodoc: @@ -28,6 +27,7 @@ module Squib opts = svgidify(opts) if params.include? :svgid opts = formatify(opts) if params.include? :formats opts = rotateify(opts) if params.include? :rotate + opts = rowify(opts) if params.include? :rows opts = convert_units(opts, params) opts end @@ -192,7 +192,7 @@ module Squib end module_function :rotateify - @@INCHES_IN_CM = 0.393700787 + @@INCHES_IN_CM = 0.393700787 # Convert units # :nodoc: # @api private @@ -214,5 +214,19 @@ module Squib end module_function :convert_units + # Handles expanding rows. If the "rows" does not respond to to_i (e.g. :infinite), + # then compute what we need based on number of cards and number of columns. + # :nodoc: + # @api private + def rowify(opts) + unless opts[:rows].respond_to? :to_i + raise "Columns must be an integer" unless opts[:columns].respond_to? :to_i + opts[:rows] = (@cards.size / opts[:columns].to_i).ceil + end + opts + end + + + end end diff --git a/samples/save_pdf.rb b/samples/save_pdf.rb deleted file mode 100644 index 0ad2b40..0000000 --- a/samples/save_pdf.rb +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env ruby -require 'squib' - -Squib::Deck.new(width: 825, height: 1125, cards: 16) do - background color: :gray - rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38 - - text str: (1..16).to_a, x: 220, y: 78, font: 'Arial 54' - - save_pdf file: 'sample-save-pdf.pdf', margin: 75, gap: 5, trim: 37 - - #Note that our PNGs still are not trimmed even though the pdf ones are - save_png range: 1, prefix: 'save_pdf_' -end diff --git a/samples/saves.rb b/samples/saves.rb new file mode 100644 index 0000000..7d080a2 --- /dev/null +++ b/samples/saves.rb @@ -0,0 +1,32 @@ +require 'squib' + +# This sample demonstrates how to use the various save methods + +Squib::Deck.new(width: 825, height: 1125, cards: 16) do + background color: :gray + rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38 + + text str: (1..16).to_a, x: 220, y: 78, font: 'Arial 54' + + # Place on multiple pages over the PDF, with bleed beeing trimmed off + save_pdf file: 'save-pdf.pdf', margin: 75, gap: 5, trim: 37 + + # Note that our PNGs still are not trimmed even though the pdf ones were + save_png range: 1, prefix: 'saves_notrim_' + + # We can also save our PNGs into a single sheet, + # rows are calculated based on cols and number of cards + save_sheet prefix: 'save_single_sheet_', + columns: 2, margin: 75, gap: 5, trim: 37 + + # Or multiple sheets if rows are also specified + save_sheet prefix: 'save_sheet_', + columns: 4, rows: 2, + margin: 75, gap: 5, trim: 37 + + # Sheets support ranges too + save_sheet prefix: 'save_sheet_range_', + range: 0..5, + columns: 2, rows: 2, + margin: 75, gap: 5, trim: 37 +end diff --git a/spec/data/samples/saves.rb.txt b/spec/data/samples/saves.rb.txt new file mode 100644 index 0000000..f4048b9 --- /dev/null +++ b/spec/data/samples/saves.rb.txt @@ -0,0 +1,702 @@ +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: paint([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: set_line_width([2.0]) +cairo: stroke([]) +cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38]) +cairo: set_source_color([#]) +cairo: fill([]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["1"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["2"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["3"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["4"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["5"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["6"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["7"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["8"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["9"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["10"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["11"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["12"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["13"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["14"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["15"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: save([]) +cairo: set_source_color([#]) +cairo: translate([220, 78]) +cairo: rotate([0]) +cairo: translate([-220, -78]) +cairo: move_to([220, 78]) +pango: font_description=([]) +pango: text=(["16"]) +pango: wrap=([#]) +pango: ellipsize=([#]) +pango: alignment=([#]) +pango: justify=([false]) +pango: spacing=([0]) +cairo: update_pango_layout([MockDouble]) +cairo: update_pango_layout([MockDouble]) +cairo: show_pango_layout([MockDouble]) +cairo: restore([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 285, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 390, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 495, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 600, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 705, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 810, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 915, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1020, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1125, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1230, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1335, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1440, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1545, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 1650, 75]) +cairo: paint([]) +surface: write_to_png(["_output/saves_notrim_1.png"]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 287]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 287]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 393]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 393]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 499]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 499]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 605]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 605]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 711]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 711]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 817]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 817]) +cairo: paint([]) +surface: write_to_png(["_output/save_single_sheet_0.png"]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 285, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 390, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 285, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 390, 181]) +cairo: paint([]) +surface: write_to_png(["_output/save_sheet_0.png"]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 285, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 390, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 285, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 390, 181]) +cairo: paint([]) +surface: write_to_png(["_output/save_sheet_1.png"]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 181]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 181]) +cairo: paint([]) +surface: write_to_png(["_output/save_sheet_range_0.png"]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 75, 75]) +cairo: paint([]) +cairo: set_source([MockDouble, -37, -37]) +cairo: paint([]) +cairo: set_source([MockDouble, 180, 75]) +cairo: paint([]) +surface: write_to_png(["_output/save_sheet_range_1.png"]) diff --git a/spec/input_helpers_spec.rb b/spec/input_helpers_spec.rb index 202ad1b..8cf6bad 100644 --- a/spec/input_helpers_spec.rb +++ b/spec/input_helpers_spec.rb @@ -176,4 +176,20 @@ describe Squib::InputHelpers do end + context '#rowify' do + # it 'does nothing on an integer' do + # opts = @deck.send(:rowify, {columns: 2, rows: 2}) + # expect(opts).to eq({ columns: 2, + # rows: 2 + # }) + # end + + it 'computes properly on non-integer' do + opts = @deck.send(:rowify, {columns: 1, rows: :infinite}) + expect(opts).to eq({ columns: 1, + rows: 2 + }) + end + end + end diff --git a/spec/samples/samples_regression_spec.rb b/spec/samples/samples_regression_spec.rb index f9dc593..3d5fd55 100644 --- a/spec/samples/samples_regression_spec.rb +++ b/spec/samples/samples_regression_spec.rb @@ -57,7 +57,7 @@ describe "Squib samples" do load_images.rb portrait-landscape.rb ranges.rb - save_pdf.rb + saves.rb text_options.rb tgc_proofs.rb units.rb diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c76046f..beee729 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -58,6 +58,7 @@ def mock_cairo(strio) allow(ProgressBar).to receive(:create).and_return(Squib::DoNothing.new) 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(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)