squib 0.14.1 → 0.14.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +41 -41
  3. data/.travis.yml +19 -19
  4. data/CHANGELOG.md +357 -340
  5. data/CONTRIBUTING.md +40 -40
  6. data/Gemfile +2 -2
  7. data/LICENSE.txt +22 -22
  8. data/README.md +121 -121
  9. data/RELEASE TODO.md +21 -21
  10. data/Rakefile +48 -48
  11. data/appveyor.yml +24 -24
  12. data/bin/squib +4 -4
  13. data/lib/squib.rb +32 -32
  14. data/lib/squib/api/background.rb +15 -15
  15. data/lib/squib/api/data.rb +137 -137
  16. data/lib/squib/api/groups.rb +54 -54
  17. data/lib/squib/api/image.rb +49 -49
  18. data/lib/squib/api/save.rb +83 -83
  19. data/lib/squib/api/settings.rb +21 -21
  20. data/lib/squib/api/shapes.rb +124 -124
  21. data/lib/squib/api/text.rb +25 -25
  22. data/lib/squib/api/text_embed.rb +71 -71
  23. data/lib/squib/api/units.rb +27 -27
  24. data/lib/squib/args/arg_loader.rb +126 -126
  25. data/lib/squib/args/box.rb +55 -55
  26. data/lib/squib/args/card_range.rb +32 -32
  27. data/lib/squib/args/color_validator.rb +12 -12
  28. data/lib/squib/args/coords.rb +35 -35
  29. data/lib/squib/args/csv_opts.rb +25 -25
  30. data/lib/squib/args/dir_validator.rb +16 -16
  31. data/lib/squib/args/draw.rb +92 -92
  32. data/lib/squib/args/embed_adjust.rb +25 -25
  33. data/lib/squib/args/embed_key.rb +17 -17
  34. data/lib/squib/args/hand_special.rb +37 -37
  35. data/lib/squib/args/import.rb +40 -40
  36. data/lib/squib/args/input_file.rb +37 -37
  37. data/lib/squib/args/paint.rb +44 -44
  38. data/lib/squib/args/paragraph.rb +116 -116
  39. data/lib/squib/args/save_batch.rb +63 -63
  40. data/lib/squib/args/scale_box.rb +53 -53
  41. data/lib/squib/args/sheet.rb +172 -172
  42. data/lib/squib/args/showcase_special.rb +38 -38
  43. data/lib/squib/args/sprue_file.rb +44 -44
  44. data/lib/squib/args/svg_special.rb +37 -37
  45. data/lib/squib/args/transform.rb +61 -61
  46. data/lib/squib/args/typographer.rb +119 -119
  47. data/lib/squib/args/unit_conversion.rb +29 -29
  48. data/lib/squib/builtin/layouts/economy.yml +85 -85
  49. data/lib/squib/builtin/layouts/fantasy.yml +101 -101
  50. data/lib/squib/builtin/layouts/hand.yml +62 -62
  51. data/lib/squib/builtin/layouts/party.yml +94 -94
  52. data/lib/squib/builtin/layouts/playing-card.yml +35 -35
  53. data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
  54. data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
  55. data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
  56. data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
  57. data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
  58. data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
  59. data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
  60. data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
  61. data/lib/squib/builtin/projects/advanced/config.yml +49 -49
  62. data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
  63. data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
  64. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
  65. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
  66. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
  67. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
  68. data/lib/squib/builtin/projects/basic/.gitignore +4 -4
  69. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
  70. data/lib/squib/builtin/projects/basic/Gemfile +3 -3
  71. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
  72. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
  73. data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
  74. data/lib/squib/builtin/projects/basic/RULES.md +21 -21
  75. data/lib/squib/builtin/projects/basic/Rakefile +7 -7
  76. data/lib/squib/builtin/projects/basic/config.yml +49 -49
  77. data/lib/squib/builtin/projects/basic/deck.rb +6 -6
  78. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
  79. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
  80. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
  81. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
  82. data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -0
  83. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
  84. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
  85. data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -0
  86. data/lib/squib/card.rb +75 -74
  87. data/lib/squib/commands/cli.rb +39 -39
  88. data/lib/squib/commands/data/template_option.rb +109 -109
  89. data/lib/squib/commands/make_sprue.rb +275 -275
  90. data/lib/squib/commands/new.rb +77 -77
  91. data/lib/squib/conf.rb +139 -139
  92. data/lib/squib/constants.rb +17 -17
  93. data/lib/squib/deck.rb +116 -116
  94. data/lib/squib/graphics/background.rb +14 -14
  95. data/lib/squib/graphics/cairo_context_wrapper.rb +113 -113
  96. data/lib/squib/graphics/embedding_utils.rb +28 -28
  97. data/lib/squib/graphics/gradient_regex.rb +47 -47
  98. data/lib/squib/graphics/hand.rb +42 -42
  99. data/lib/squib/graphics/image.rb +108 -108
  100. data/lib/squib/graphics/save_doc.rb +61 -61
  101. data/lib/squib/graphics/save_images.rb +52 -52
  102. data/lib/squib/graphics/save_pdf.rb +90 -90
  103. data/lib/squib/graphics/save_sprue.rb +204 -205
  104. data/lib/squib/graphics/shapes.rb +143 -143
  105. data/lib/squib/graphics/showcase.rb +85 -85
  106. data/lib/squib/graphics/text.rb +174 -174
  107. data/lib/squib/import/data_frame.rb +108 -108
  108. data/lib/squib/layout_parser.rb +138 -126
  109. data/lib/squib/progress.rb +38 -38
  110. data/lib/squib/sample_helpers.rb +34 -34
  111. data/lib/squib/sprues/crop_line.rb +28 -28
  112. data/lib/squib/sprues/crop_line_dash.rb +35 -35
  113. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
  114. data/lib/squib/sprues/sprue.rb +203 -203
  115. data/lib/squib/sprues/sprue_schema.rb +48 -48
  116. data/lib/squib/version.rb +10 -10
  117. data/samples/autoscale_font/_autoscale_font.rb +29 -29
  118. data/samples/backend/_backend.rb +26 -26
  119. data/samples/basic.rb +19 -19
  120. data/samples/build_groups/build_groups.rb +36 -36
  121. data/samples/colors/_colors.rb +38 -38
  122. data/samples/colors/_gradients.rb +34 -34
  123. data/samples/config/config_text_markup.rb +20 -20
  124. data/samples/config/custom_config.rb +18 -18
  125. data/samples/data/_csv.rb +33 -33
  126. data/samples/data/_excel.rb +55 -55
  127. data/samples/data/_yaml.rb +12 -12
  128. data/samples/hello_world.rb +6 -6
  129. data/samples/images/_cairo_access.rb +39 -39
  130. data/samples/images/_images.rb +104 -104
  131. data/samples/images/_more_load_images.rb +102 -102
  132. data/samples/intro/01_hello.rb +8 -8
  133. data/samples/intro/02_options.rb +14 -14
  134. data/samples/intro/03_layout.rb +11 -11
  135. data/samples/intro/04_arrays.rb +15 -15
  136. data/samples/intro/05_excel.rb +14 -14
  137. data/samples/layouts/builtin_layouts.rb +97 -97
  138. data/samples/layouts/layouts.rb +71 -71
  139. data/samples/project/src/characters.rb +8 -8
  140. data/samples/project/src/skills.rb +7 -7
  141. data/samples/proofs/_tgc_proofs.rb +16 -16
  142. data/samples/ranges/_ranges.rb +64 -64
  143. data/samples/saves/_hand.rb +23 -23
  144. data/samples/saves/_portrait_landscape.rb +23 -23
  145. data/samples/saves/_save_pdf.rb +29 -29
  146. data/samples/saves/_saves.rb +51 -51
  147. data/samples/saves/_showcase.rb +25 -25
  148. data/samples/shapes/_draw_shapes.rb +60 -58
  149. data/samples/shapes/_proofs.rb +22 -22
  150. data/samples/sprues/_advanced_sprues.rb +24 -24
  151. data/samples/sprues/_builtin_sprues.rb +21 -19
  152. data/samples/sprues/_fold_sheet.rb +27 -27
  153. data/samples/sprues/_hex_tiles.rb +15 -15
  154. data/samples/sprues/_mints.rb +11 -11
  155. data/samples/sprues/_sprue_example.rb +11 -11
  156. data/samples/text/_embed_text.rb +128 -128
  157. data/samples/text/_text.rb +47 -47
  158. data/samples/text/_text_options.rb +102 -102
  159. data/samples/text/bug134.rb +14 -14
  160. data/samples/units/_units.rb +32 -32
  161. data/squib.gemspec +52 -51
  162. metadata +66 -50
@@ -1,63 +1,63 @@
1
- require_relative 'arg_loader'
2
- require_relative 'dir_validator'
3
-
4
- module Squib
5
- # @api private
6
- module Args
7
- class SaveBatch
8
- include ArgLoader
9
- include DirValidator
10
-
11
- def initialize
12
- end
13
-
14
- def self.parameters
15
- {
16
- angle: 0,
17
- count_format: '%02d',
18
- dir: '_output',
19
- prefix: 'card_',
20
- rotate: false,
21
- trim_radius: 0,
22
- trim: 0,
23
- }
24
- end
25
-
26
- def self.expanding_parameters
27
- self.parameters.keys # all of them
28
- end
29
-
30
- def self.params_with_units
31
- [:trim, :trim_radius]
32
- end
33
-
34
- def validate_dir(arg, _i)
35
- ensure_dir_created(arg)
36
- end
37
-
38
- def validate_rotate(arg, i)
39
- case arg
40
- when true, :clockwise
41
- angle[i] = 0.5 * Math::PI
42
- return true
43
- when :counterclockwise
44
- angle[i] = 1.5 * Math::PI
45
- return true
46
- when false
47
- false
48
- else
49
- raise 'invalid option to rotate: only [true, false, :clockwise, :counterclockwise]'
50
- end
51
- end
52
-
53
- def full_filename(i)
54
- "#{dir[i]}/#{prefix[i]}#{count_format[i] % i}.png"
55
- end
56
-
57
- def summary
58
- "#{dir[0]}/#{prefix[0]}_*"
59
- end
60
-
61
- end
62
- end
63
- end
1
+ require_relative 'arg_loader'
2
+ require_relative 'dir_validator'
3
+
4
+ module Squib
5
+ # @api private
6
+ module Args
7
+ class SaveBatch
8
+ include ArgLoader
9
+ include DirValidator
10
+
11
+ def initialize
12
+ end
13
+
14
+ def self.parameters
15
+ {
16
+ angle: 0,
17
+ count_format: '%02d',
18
+ dir: '_output',
19
+ prefix: 'card_',
20
+ rotate: false,
21
+ trim_radius: 0,
22
+ trim: 0,
23
+ }
24
+ end
25
+
26
+ def self.expanding_parameters
27
+ self.parameters.keys # all of them
28
+ end
29
+
30
+ def self.params_with_units
31
+ [:trim, :trim_radius]
32
+ end
33
+
34
+ def validate_dir(arg, _i)
35
+ ensure_dir_created(arg)
36
+ end
37
+
38
+ def validate_rotate(arg, i)
39
+ case arg
40
+ when true, :clockwise
41
+ angle[i] = 0.5 * Math::PI
42
+ return true
43
+ when :counterclockwise
44
+ angle[i] = 1.5 * Math::PI
45
+ return true
46
+ when false
47
+ false
48
+ else
49
+ raise 'invalid option to rotate: only [true, false, :clockwise, :counterclockwise]'
50
+ end
51
+ end
52
+
53
+ def full_filename(i)
54
+ "#{dir[i]}/#{prefix[i]}#{count_format[i] % i}.png"
55
+ end
56
+
57
+ def summary
58
+ "#{dir[0]}/#{prefix[0]}_*"
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -1,53 +1,53 @@
1
- require_relative 'arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class ScaleBox
8
- include ArgLoader
9
-
10
- def initialize(deck)
11
- @deck = deck
12
- end
13
-
14
- def self.parameters
15
- { x: 0, y: 0,
16
- width: :native, height: :native
17
- }
18
- end
19
-
20
- def self.expanding_parameters
21
- parameters.keys # all of them
22
- end
23
-
24
- def self.params_with_units
25
- parameters.keys # all of them
26
- end
27
-
28
- def validate_width(arg, i)
29
- return @deck.width if arg.to_s == 'deck'
30
- return :native if arg.to_s == 'native'
31
- return arg if arg.respond_to? :to_f
32
- if arg.to_s == 'scale'
33
- raise 'if width is :scale, height must be a number' unless height[i].respond_to? :to_f
34
- return arg
35
- end
36
- raise 'width must be a number, :scale, :native, or :deck'
37
- end
38
-
39
- def validate_height(arg, i)
40
- return @deck.height if arg.to_s == 'deck'
41
- return :native if arg.to_s == 'native'
42
- return arg if arg.respond_to? :to_f
43
- if arg.to_s == 'scale'
44
- raise 'if height is \'scale\', width must be a number' unless width[i].respond_to? :to_f
45
- return arg
46
- end
47
- raise 'height must be a number, :scale, :native, or :deck'
48
- end
49
-
50
- end
51
-
52
- end
53
- end
1
+ require_relative 'arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class ScaleBox
8
+ include ArgLoader
9
+
10
+ def initialize(deck)
11
+ @deck = deck
12
+ end
13
+
14
+ def self.parameters
15
+ { x: 0, y: 0,
16
+ width: :native, height: :native
17
+ }
18
+ end
19
+
20
+ def self.expanding_parameters
21
+ parameters.keys # all of them
22
+ end
23
+
24
+ def self.params_with_units
25
+ parameters.keys # all of them
26
+ end
27
+
28
+ def validate_width(arg, i)
29
+ return @deck.width if arg.to_s == 'deck'
30
+ return :native if arg.to_s == 'native'
31
+ return arg if arg.respond_to? :to_f
32
+ if arg.to_s == 'scale'
33
+ raise 'if width is :scale, height must be a number' unless height[i].respond_to? :to_f
34
+ return arg
35
+ end
36
+ raise 'width must be a number, :scale, :native, or :deck'
37
+ end
38
+
39
+ def validate_height(arg, i)
40
+ return @deck.height if arg.to_s == 'deck'
41
+ return :native if arg.to_s == 'native'
42
+ return arg if arg.respond_to? :to_f
43
+ if arg.to_s == 'scale'
44
+ raise 'if height is \'scale\', width must be a number' unless width[i].respond_to? :to_f
45
+ return arg
46
+ end
47
+ raise 'height must be a number, :scale, :native, or :deck'
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end
@@ -1,172 +1,172 @@
1
- require 'cairo'
2
- require_relative 'arg_loader'
3
- require_relative 'color_validator'
4
- require_relative 'dir_validator'
5
-
6
- module Squib
7
- # @api private
8
- module Args
9
-
10
- class Sheet
11
- include ArgLoader
12
- include ColorValidator
13
- include DirValidator
14
-
15
- def initialize(custom_colors = {}, dsl_method_defaults = {}, deck_size = 1, dpi = 300)
16
- @custom_colors = custom_colors
17
- @dsl_method_defaults = dsl_method_defaults
18
- @deck_size = deck_size
19
- @dpi = dpi
20
- end
21
-
22
- def self.parameters
23
- {
24
- count_format: '%02d',
25
- crop_margin_bottom: 0,
26
- crop_margin_left: 0,
27
- crop_margin_right: 0,
28
- crop_margin_top: 0,
29
- crop_marks: false,
30
- crop_stroke_color: :black,
31
- crop_stroke_dash: '',
32
- crop_stroke_width: 1.5,
33
- dir: '_output',
34
- file: 'sheet.png',
35
- fill_color: :white,
36
- gap: 0,
37
- height: 2550,
38
- margin: 75,
39
- prefix: 'sheet_',
40
- rows: :infinite,
41
- columns: 5,
42
- trim_radius: 38,
43
- trim: 0,
44
- width: 3300,
45
- range: :all,
46
- rtl: false,
47
- }
48
- end
49
-
50
- def self.expanding_parameters
51
- [] # none of them
52
- end
53
-
54
- def self.params_with_units
55
- [ :crop_margin_bottom, :crop_margin_left, :crop_margin_right,
56
- :crop_margin_top, :gap, :height, :margin, :trim_radius, :trim,
57
- :width
58
- ]
59
- end
60
-
61
- def validate_crop_stroke_dash(arg)
62
- arg.to_s.split.collect do |x|
63
- UnitConversion.parse(x, @dpi).to_f
64
- end
65
- end
66
-
67
- def validate_crop_marks(arg)
68
- arg.to_s.downcase.to_sym unless arg == false
69
- end
70
-
71
- def validate_fill_color(arg)
72
- colorify(arg, @custom_colors)
73
- end
74
-
75
- def validate_dir(arg)
76
- ensure_dir_created(arg)
77
- end
78
-
79
- def validate_columns(arg)
80
- raise 'columns must be an integer' unless arg.respond_to? :to_i
81
- arg.to_i
82
- end
83
-
84
- def validate_rows(arg)
85
- raise 'columns must be an integer' unless columns.respond_to? :to_i
86
- count = if range == :all
87
- @deck_size
88
- else
89
- count = range.to_a.length
90
- end
91
- return 1 if count <= columns
92
- return arg if arg.respond_to? :to_i
93
- (count.to_f / columns.to_f).ceil
94
- end
95
-
96
- def full_filename(i=nil)
97
- if i.nil?
98
- "#{dir}/#{file}"
99
- else
100
- "#{dir}/#{prefix}#{count_format % i}.png"
101
- end
102
- end
103
-
104
- def crop_coords(x, y, deck_w, deck_h)
105
- case crop_marks
106
- when false
107
- []
108
- when :full
109
- [
110
- {
111
- # Vertical, Left
112
- x1: x + trim + crop_margin_left, y1: 0,
113
- x2: x + trim + crop_margin_left, y2: height - margin + 1
114
- },
115
- {
116
- # Vertical, Right
117
- x1: x + deck_w - trim - crop_margin_right, y1: 0,
118
- x2: x + deck_w - trim - crop_margin_right, y2: height - margin + 1
119
- },
120
- {
121
- # Horizontal, Top
122
- x1: 0 , y1: y + trim + crop_margin_top,
123
- x2: width - margin + 1, y2: y + trim + crop_margin_top
124
- },
125
- {
126
- # Horizontal, Bottom
127
- x1: 0 , y1: y + deck_h - trim - crop_margin_bottom,
128
- x2: width - margin + 1, y2: y + deck_h - trim - crop_margin_bottom
129
- },
130
- ]
131
- else # e.g. :margin
132
- [
133
- { # Vertical, Upper-left
134
- x1: x + trim + crop_margin_left, y1: 0,
135
- x2: x + trim + crop_margin_left, y2: margin - 1
136
- },
137
- { # Vertical , Upper-right
138
- x1: x + deck_w - trim - crop_margin_right, y1: 0,
139
- x2: x + deck_w - trim - crop_margin_right, y2: margin - 1
140
- },
141
- { # Vertical , Lower-left
142
- x1: x + trim + crop_margin_left, y1: height,
143
- x2: x + trim + crop_margin_left, y2: height - margin + 1
144
- },
145
- { # Vertical , Lower-right
146
- x1: x + deck_w - trim - crop_margin_right, y1: height,
147
- x2: x + deck_w - trim - crop_margin_right, y2: height - margin + 1
148
- },
149
- { # Horizontal, Upper-left
150
- x1: 0 , y1: y + trim + crop_margin_top,
151
- x2: margin - 1, y2: y + trim + crop_margin_top
152
- },
153
- { # Horizontal, Upper-Right
154
- x1: width , y1: y + trim + crop_margin_top,
155
- x2: width - margin + 1, y2: y + trim + crop_margin_top
156
- },
157
- { # Horizontal, Lower-Left
158
- x1: 0 , y1: y + deck_h - trim - crop_margin_bottom,
159
- x2: margin - 1, y2: y + deck_h - trim - crop_margin_bottom
160
- },
161
- { # Horizontal, Lower-Right
162
- x1: width, y1: y + deck_h - trim - crop_margin_bottom,
163
- x2: width - margin + 1, y2: y + deck_h - trim - crop_margin_bottom
164
- },
165
- ]
166
- end
167
- end
168
-
169
- end
170
-
171
- end
172
- end
1
+ require 'cairo'
2
+ require_relative 'arg_loader'
3
+ require_relative 'color_validator'
4
+ require_relative 'dir_validator'
5
+
6
+ module Squib
7
+ # @api private
8
+ module Args
9
+
10
+ class Sheet
11
+ include ArgLoader
12
+ include ColorValidator
13
+ include DirValidator
14
+
15
+ def initialize(custom_colors = {}, dsl_method_defaults = {}, deck_size = 1, dpi = 300)
16
+ @custom_colors = custom_colors
17
+ @dsl_method_defaults = dsl_method_defaults
18
+ @deck_size = deck_size
19
+ @dpi = dpi
20
+ end
21
+
22
+ def self.parameters
23
+ {
24
+ count_format: '%02d',
25
+ crop_margin_bottom: 0,
26
+ crop_margin_left: 0,
27
+ crop_margin_right: 0,
28
+ crop_margin_top: 0,
29
+ crop_marks: false,
30
+ crop_stroke_color: :black,
31
+ crop_stroke_dash: '',
32
+ crop_stroke_width: 1.5,
33
+ dir: '_output',
34
+ file: 'sheet.png',
35
+ fill_color: :white,
36
+ gap: 0,
37
+ height: 2550,
38
+ margin: 75,
39
+ prefix: 'sheet_',
40
+ rows: :infinite,
41
+ columns: 5,
42
+ trim_radius: 38,
43
+ trim: 0,
44
+ width: 3300,
45
+ range: :all,
46
+ rtl: false,
47
+ }
48
+ end
49
+
50
+ def self.expanding_parameters
51
+ [] # none of them
52
+ end
53
+
54
+ def self.params_with_units
55
+ [ :crop_margin_bottom, :crop_margin_left, :crop_margin_right,
56
+ :crop_margin_top, :gap, :height, :margin, :trim_radius, :trim,
57
+ :width
58
+ ]
59
+ end
60
+
61
+ def validate_crop_stroke_dash(arg)
62
+ arg.to_s.split.collect do |x|
63
+ UnitConversion.parse(x, @dpi).to_f
64
+ end
65
+ end
66
+
67
+ def validate_crop_marks(arg)
68
+ arg.to_s.downcase.to_sym unless arg == false
69
+ end
70
+
71
+ def validate_fill_color(arg)
72
+ colorify(arg, @custom_colors)
73
+ end
74
+
75
+ def validate_dir(arg)
76
+ ensure_dir_created(arg)
77
+ end
78
+
79
+ def validate_columns(arg)
80
+ raise 'columns must be an integer' unless arg.respond_to? :to_i
81
+ arg.to_i
82
+ end
83
+
84
+ def validate_rows(arg)
85
+ raise 'columns must be an integer' unless columns.respond_to? :to_i
86
+ count = if range == :all
87
+ @deck_size
88
+ else
89
+ count = range.to_a.length
90
+ end
91
+ return 1 if count <= columns
92
+ return arg if arg.respond_to? :to_i
93
+ (count.to_f / columns.to_f).ceil
94
+ end
95
+
96
+ def full_filename(i=nil)
97
+ if i.nil?
98
+ "#{dir}/#{file}"
99
+ else
100
+ "#{dir}/#{prefix}#{count_format % i}.png"
101
+ end
102
+ end
103
+
104
+ def crop_coords(x, y, deck_w, deck_h)
105
+ case crop_marks
106
+ when false
107
+ []
108
+ when :full
109
+ [
110
+ {
111
+ # Vertical, Left
112
+ x1: x + trim + crop_margin_left, y1: 0,
113
+ x2: x + trim + crop_margin_left, y2: height - margin + 1
114
+ },
115
+ {
116
+ # Vertical, Right
117
+ x1: x + deck_w - trim - crop_margin_right, y1: 0,
118
+ x2: x + deck_w - trim - crop_margin_right, y2: height - margin + 1
119
+ },
120
+ {
121
+ # Horizontal, Top
122
+ x1: 0 , y1: y + trim + crop_margin_top,
123
+ x2: width - margin + 1, y2: y + trim + crop_margin_top
124
+ },
125
+ {
126
+ # Horizontal, Bottom
127
+ x1: 0 , y1: y + deck_h - trim - crop_margin_bottom,
128
+ x2: width - margin + 1, y2: y + deck_h - trim - crop_margin_bottom
129
+ },
130
+ ]
131
+ else # e.g. :margin
132
+ [
133
+ { # Vertical, Upper-left
134
+ x1: x + trim + crop_margin_left, y1: 0,
135
+ x2: x + trim + crop_margin_left, y2: margin - 1
136
+ },
137
+ { # Vertical , Upper-right
138
+ x1: x + deck_w - trim - crop_margin_right, y1: 0,
139
+ x2: x + deck_w - trim - crop_margin_right, y2: margin - 1
140
+ },
141
+ { # Vertical , Lower-left
142
+ x1: x + trim + crop_margin_left, y1: height,
143
+ x2: x + trim + crop_margin_left, y2: height - margin + 1
144
+ },
145
+ { # Vertical , Lower-right
146
+ x1: x + deck_w - trim - crop_margin_right, y1: height,
147
+ x2: x + deck_w - trim - crop_margin_right, y2: height - margin + 1
148
+ },
149
+ { # Horizontal, Upper-left
150
+ x1: 0 , y1: y + trim + crop_margin_top,
151
+ x2: margin - 1, y2: y + trim + crop_margin_top
152
+ },
153
+ { # Horizontal, Upper-Right
154
+ x1: width , y1: y + trim + crop_margin_top,
155
+ x2: width - margin + 1, y2: y + trim + crop_margin_top
156
+ },
157
+ { # Horizontal, Lower-Left
158
+ x1: 0 , y1: y + deck_h - trim - crop_margin_bottom,
159
+ x2: margin - 1, y2: y + deck_h - trim - crop_margin_bottom
160
+ },
161
+ { # Horizontal, Lower-Right
162
+ x1: width, y1: y + deck_h - trim - crop_margin_bottom,
163
+ x2: width - margin + 1, y2: y + deck_h - trim - crop_margin_bottom
164
+ },
165
+ ]
166
+ end
167
+ end
168
+
169
+ end
170
+
171
+ end
172
+ end