squib 0.14.2 → 0.14.3.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +41 -41
  3. data/.travis.yml +19 -19
  4. data/CHANGELOG.md +366 -357
  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 +53 -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 +53 -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 -10
  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 -68
  86. data/lib/squib/card.rb +75 -75
  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 +144 -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 +129 -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 -204
  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 -138
  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/bug256/_bug256.rb +13 -0
  121. data/samples/build_groups/build_groups.rb +36 -36
  122. data/samples/colors/_colors.rb +38 -38
  123. data/samples/colors/_gradients.rb +34 -34
  124. data/samples/config/config_text_markup.rb +20 -20
  125. data/samples/config/custom_config.rb +18 -18
  126. data/samples/data/_csv.rb +33 -33
  127. data/samples/data/_excel.rb +55 -55
  128. data/samples/data/_yaml.rb +12 -12
  129. data/samples/hello_world.rb +6 -6
  130. data/samples/images/_cairo_access.rb +39 -39
  131. data/samples/images/_images.rb +104 -104
  132. data/samples/images/_more_load_images.rb +102 -102
  133. data/samples/intro/01_hello.rb +8 -8
  134. data/samples/intro/02_options.rb +14 -14
  135. data/samples/intro/03_layout.rb +11 -11
  136. data/samples/intro/04_arrays.rb +15 -15
  137. data/samples/intro/05_excel.rb +14 -14
  138. data/samples/layouts/builtin_layouts.rb +97 -97
  139. data/samples/layouts/layouts.rb +71 -71
  140. data/samples/project/src/characters.rb +8 -8
  141. data/samples/project/src/skills.rb +7 -7
  142. data/samples/proofs/_tgc_proofs.rb +16 -16
  143. data/samples/ranges/_ranges.rb +64 -64
  144. data/samples/saves/_hand.rb +23 -23
  145. data/samples/saves/_portrait_landscape.rb +23 -23
  146. data/samples/saves/_save_pdf.rb +29 -29
  147. data/samples/saves/_saves.rb +51 -51
  148. data/samples/saves/_showcase.rb +25 -25
  149. data/samples/shapes/_draw_shapes.rb +60 -60
  150. data/samples/shapes/_proofs.rb +22 -22
  151. data/samples/sprues/_advanced_sprues.rb +24 -24
  152. data/samples/sprues/_builtin_sprues.rb +21 -21
  153. data/samples/sprues/_fold_sheet.rb +27 -27
  154. data/samples/sprues/_hex_tiles.rb +15 -15
  155. data/samples/sprues/_mints.rb +11 -11
  156. data/samples/sprues/_sprue_example.rb +11 -11
  157. data/samples/text/_embed_text.rb +128 -128
  158. data/samples/text/_text.rb +47 -47
  159. data/samples/text/_text_options.rb +102 -102
  160. data/samples/text/bug134.rb +14 -14
  161. data/samples/units/_units.rb +32 -32
  162. data/squib.gemspec +52 -52
  163. metadata +51 -48
@@ -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