squib 0.18.0 → 0.19.0a

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -39
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +22 -22
  4. data/.github/ISSUE_TEMPLATE/help-wanted.md +13 -13
  5. data/.github/ISSUE_TEMPLATE/release-todo.md +45 -33
  6. data/.github/PULL_REQUEST_TEMPLATE.md +13 -13
  7. data/.github/workflows/tests.yml +22 -22
  8. data/.gitignore +41 -41
  9. data/.vscode/settings.json +4 -3
  10. data/CHANGELOG.md +460 -460
  11. data/CONTRIBUTING.md +40 -40
  12. data/Dockerfile +27 -27
  13. data/Gemfile +2 -2
  14. data/Guardfile +8 -8
  15. data/LICENSE.txt +22 -22
  16. data/README.md +139 -139
  17. data/Rakefile +51 -51
  18. data/bin/squib +5 -5
  19. data/lib/squib/api/settings.rb +21 -21
  20. data/lib/squib/args/arg_loader.rb +138 -138
  21. data/lib/squib/args/box.rb +59 -59
  22. data/lib/squib/args/card_range.rb +34 -34
  23. data/lib/squib/args/color_validator.rb +7 -7
  24. data/lib/squib/args/coords.rb +49 -49
  25. data/lib/squib/args/csv_opts.rb +22 -22
  26. data/lib/squib/args/dir_validator.rb +11 -11
  27. data/lib/squib/args/draw.rb +93 -93
  28. data/lib/squib/args/drop_shadow.rb +39 -39
  29. data/lib/squib/args/embed_adjust.rb +22 -22
  30. data/lib/squib/args/embed_key.rb +12 -12
  31. data/lib/squib/args/hand_special.rb +37 -37
  32. data/lib/squib/args/import.rb +67 -67
  33. data/lib/squib/args/input_file.rb +55 -55
  34. data/lib/squib/args/paint.rb +43 -43
  35. data/lib/squib/args/paragraph.rb +118 -118
  36. data/lib/squib/args/save_batch.rb +65 -65
  37. data/lib/squib/args/scale_box.rb +57 -57
  38. data/lib/squib/args/sheet.rb +165 -165
  39. data/lib/squib/args/showcase_special.rb +41 -41
  40. data/lib/squib/args/sprue_file.rb +44 -44
  41. data/lib/squib/args/svg_special.rb +37 -37
  42. data/lib/squib/args/transform.rb +55 -55
  43. data/lib/squib/args/typographer.rb +115 -115
  44. data/lib/squib/args/unit_conversion.rb +27 -27
  45. data/lib/squib/args/xywh_shorthands.rb +50 -50
  46. data/lib/squib/builtin/layouts/economy.yml +85 -85
  47. data/lib/squib/builtin/layouts/fantasy.yml +101 -101
  48. data/lib/squib/builtin/layouts/hand.yml +62 -62
  49. data/lib/squib/builtin/layouts/party.yml +94 -94
  50. data/lib/squib/builtin/layouts/playing-card.yml +35 -35
  51. data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
  52. data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
  53. data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
  54. data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
  55. data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
  56. data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
  57. data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
  58. data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
  59. data/lib/squib/builtin/projects/advanced/config.yml +49 -49
  60. data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
  61. data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
  62. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
  63. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
  64. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
  65. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
  66. data/lib/squib/builtin/projects/basic/.gitignore +4 -4
  67. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
  68. data/lib/squib/builtin/projects/basic/Gemfile +3 -3
  69. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
  70. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
  71. data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
  72. data/lib/squib/builtin/projects/basic/RULES.md +21 -21
  73. data/lib/squib/builtin/projects/basic/Rakefile +7 -7
  74. data/lib/squib/builtin/projects/basic/config.yml +50 -50
  75. data/lib/squib/builtin/projects/basic/deck.rb +6 -6
  76. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
  77. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
  78. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
  79. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
  80. data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
  81. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
  82. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
  83. data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
  84. data/lib/squib/card.rb +75 -75
  85. data/lib/squib/commands/cli.rb +39 -39
  86. data/lib/squib/commands/data/template_option.rb +109 -109
  87. data/lib/squib/commands/make_sprue.rb +277 -277
  88. data/lib/squib/commands/new.rb +77 -77
  89. data/lib/squib/conf.rb +149 -149
  90. data/lib/squib/constants.rb +17 -17
  91. data/lib/squib/deck.rb +138 -138
  92. data/lib/squib/dsl/background.rb +35 -35
  93. data/lib/squib/dsl/circle.rb +39 -39
  94. data/lib/squib/dsl/csv.rb +42 -42
  95. data/lib/squib/dsl/curve.rb +35 -35
  96. data/lib/squib/dsl/cut_zone.rb +47 -47
  97. data/lib/squib/dsl/ellipse.rb +37 -37
  98. data/lib/squib/dsl/grid.rb +35 -35
  99. data/lib/squib/dsl/groups.rb +54 -54
  100. data/lib/squib/dsl/hand.rb +42 -42
  101. data/lib/squib/dsl/line.rb +35 -35
  102. data/lib/squib/dsl/png.rb +57 -57
  103. data/lib/squib/dsl/polygon.rb +36 -36
  104. data/lib/squib/dsl/rect.rb +37 -37
  105. data/lib/squib/dsl/safe_zone.rb +48 -48
  106. data/lib/squib/dsl/save.rb +21 -21
  107. data/lib/squib/dsl/save_pdf.rb +50 -50
  108. data/lib/squib/dsl/save_png.rb +48 -48
  109. data/lib/squib/dsl/save_sheet.rb +53 -53
  110. data/lib/squib/dsl/showcase.rb +43 -43
  111. data/lib/squib/dsl/star.rb +37 -37
  112. data/lib/squib/dsl/svg.rb +63 -63
  113. data/lib/squib/dsl/text.rb +54 -54
  114. data/lib/squib/dsl/text_embed.rb +79 -79
  115. data/lib/squib/dsl/triangle.rb +35 -35
  116. data/lib/squib/dsl/units.rb +37 -37
  117. data/lib/squib/dsl/xlsx.rb +40 -40
  118. data/lib/squib/dsl/yaml.rb +40 -40
  119. data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -14
  120. data/lib/squib/graphics/background.rb +14 -14
  121. data/lib/squib/graphics/cairo_context_wrapper.rb +115 -115
  122. data/lib/squib/graphics/embedding_utils.rb +28 -28
  123. data/lib/squib/graphics/gradient_regex.rb +47 -47
  124. data/lib/squib/graphics/hand.rb +42 -42
  125. data/lib/squib/graphics/image.rb +123 -123
  126. data/lib/squib/graphics/save_doc.rb +77 -77
  127. data/lib/squib/graphics/save_images.rb +91 -91
  128. data/lib/squib/graphics/save_pdf.rb +90 -90
  129. data/lib/squib/graphics/save_sprue.rb +231 -231
  130. data/lib/squib/graphics/shapes.rb +143 -143
  131. data/lib/squib/graphics/showcase.rb +85 -85
  132. data/lib/squib/graphics/text.rb +202 -202
  133. data/lib/squib/import/csv_importer.rb +45 -45
  134. data/lib/squib/import/data_frame.rb +108 -108
  135. data/lib/squib/import/quantity_exploder.rb +17 -17
  136. data/lib/squib/import/xlsx_importer.rb +28 -28
  137. data/lib/squib/import/yaml_importer.rb +30 -30
  138. data/lib/squib/layout_parser.rb +155 -155
  139. data/lib/squib/progress.rb +38 -38
  140. data/lib/squib/sample_helpers.rb +34 -34
  141. data/lib/squib/sprues/crop_line.rb +28 -28
  142. data/lib/squib/sprues/crop_line_dash.rb +35 -35
  143. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
  144. data/lib/squib/sprues/sprue.rb +208 -208
  145. data/lib/squib/sprues/sprue_schema.rb +51 -51
  146. data/lib/squib/system_fonts.rb +16 -16
  147. data/lib/squib/version.rb +11 -11
  148. data/lib/squib.rb +35 -35
  149. data/samples/autoscale_font/_autoscale_font.rb +98 -98
  150. data/samples/backend/_backend.rb +26 -26
  151. data/samples/basic.rb +19 -19
  152. data/samples/build_groups/build_groups.rb +36 -36
  153. data/samples/colors/_colors.rb +44 -44
  154. data/samples/colors/_gradients.rb +34 -34
  155. data/samples/colors/_switch_color.rb +33 -33
  156. data/samples/config/config_text_markup.rb +20 -20
  157. data/samples/config/custom_config.rb +18 -18
  158. data/samples/data/_csv.rb +33 -33
  159. data/samples/data/_excel.rb +55 -55
  160. data/samples/data/_yaml.rb +12 -12
  161. data/samples/hello_world.rb +6 -6
  162. data/samples/images/_cairo_access.rb +39 -39
  163. data/samples/images/_images.rb +104 -104
  164. data/samples/images/_more_load_images.rb +102 -102
  165. data/samples/images/_placeholders.rb +48 -48
  166. data/samples/intro/01_hello.rb +8 -8
  167. data/samples/intro/02_options.rb +14 -14
  168. data/samples/intro/03_layout.rb +11 -11
  169. data/samples/intro/04_arrays.rb +15 -15
  170. data/samples/intro/05_excel.rb +14 -14
  171. data/samples/layouts/builtin_layouts.rb +97 -97
  172. data/samples/layouts/layouts.rb +71 -71
  173. data/samples/project/src/characters.rb +8 -8
  174. data/samples/project/src/skills.rb +7 -7
  175. data/samples/proofs/_tgc_proofs.rb +16 -16
  176. data/samples/ranges/_ranges.rb +64 -64
  177. data/samples/saves/_hand.rb +23 -23
  178. data/samples/saves/_portrait_landscape.rb +23 -23
  179. data/samples/saves/_save_filenames.rb +28 -28
  180. data/samples/saves/_save_pdf.rb +29 -29
  181. data/samples/saves/_saves.rb +75 -75
  182. data/samples/saves/_showcase.rb +25 -25
  183. data/samples/shadows/_shadow.rb +71 -71
  184. data/samples/shapes/_draw_shapes.rb +60 -60
  185. data/samples/shapes/_proofs.rb +22 -22
  186. data/samples/sprues/_advanced_sprues.rb +25 -25
  187. data/samples/sprues/_builtin_sprues.rb +22 -22
  188. data/samples/sprues/_fold_sheet.rb +30 -30
  189. data/samples/sprues/_hex_tiles.rb +15 -15
  190. data/samples/sprues/_mints.rb +11 -11
  191. data/samples/sprues/_negative_coords.rb +6 -6
  192. data/samples/sprues/_sprue_example.rb +11 -11
  193. data/samples/system_font_debug/_list_fonts.rb +14 -14
  194. data/samples/text/_embed_text.rb +128 -128
  195. data/samples/text/_text.rb +52 -52
  196. data/samples/text/_text_options.rb +103 -103
  197. data/samples/text/bug134.rb +14 -14
  198. data/samples/units/_cells.rb +50 -50
  199. data/samples/units/_shorthands.rb +48 -48
  200. data/samples/units/_units.rb +39 -39
  201. data/squib.gemspec +58 -58
  202. metadata +21 -21
@@ -1,40 +1,40 @@
1
- require_relative '../args/import'
2
- require_relative '../import/xlsx_importer'
3
- require_relative '../errors_warnings/warn_unexpected_params'
4
-
5
- module Squib
6
- # DSL method. See http://squib.readthedocs.io
7
- def xlsx(opts = {}, &block)
8
- DSL::Xlsx.new(__callee__).run(opts, &block)
9
- end
10
- module_function :xlsx
11
-
12
- class Deck
13
- # DSL method. See http://squib.readthedocs.io
14
- def xlsx(opts = {}, &block)
15
- DSL::Xlsx.new(__callee__).run(opts, &block)
16
- end
17
- end
18
-
19
- module DSL
20
- class Xlsx
21
- include WarnUnexpectedParams
22
- attr_reader :dsl_method, :block
23
-
24
- def initialize(dsl_method)
25
- @dsl_method = dsl_method
26
- end
27
-
28
- def self.accepted_params
29
- %i( file sheet strip explode )
30
- end
31
-
32
- def run(opts,&block)
33
- warn_if_unexpected opts
34
- import_args = Args.extract_import opts
35
- importer = Squib::Import::XlsxImporter.new
36
- importer.import_to_dataframe(import_args, &block)
37
- end
38
- end
39
- end
40
- end
1
+ require_relative '../args/import'
2
+ require_relative '../import/xlsx_importer'
3
+ require_relative '../errors_warnings/warn_unexpected_params'
4
+
5
+ module Squib
6
+ # DSL method. See http://squib.readthedocs.io
7
+ def xlsx(opts = {}, &block)
8
+ DSL::Xlsx.new(__callee__).run(opts, &block)
9
+ end
10
+ module_function :xlsx
11
+
12
+ class Deck
13
+ # DSL method. See http://squib.readthedocs.io
14
+ def xlsx(opts = {}, &block)
15
+ DSL::Xlsx.new(__callee__).run(opts, &block)
16
+ end
17
+ end
18
+
19
+ module DSL
20
+ class Xlsx
21
+ include WarnUnexpectedParams
22
+ attr_reader :dsl_method, :block
23
+
24
+ def initialize(dsl_method)
25
+ @dsl_method = dsl_method
26
+ end
27
+
28
+ def self.accepted_params
29
+ %i( file sheet strip explode )
30
+ end
31
+
32
+ def run(opts,&block)
33
+ warn_if_unexpected opts
34
+ import_args = Args.extract_import opts
35
+ importer = Squib::Import::XlsxImporter.new
36
+ importer.import_to_dataframe(import_args, &block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,40 +1,40 @@
1
- require_relative '../args/import'
2
- require_relative '../import/yaml_importer'
3
- require_relative '../errors_warnings/warn_unexpected_params'
4
-
5
- module Squib
6
- # DSL method. See http://squib.readthedocs.io
7
- def yaml(opts = {}, &block)
8
- DSL::Yaml.new(__callee__).run(opts, &block)
9
- end
10
- module_function :yaml
11
-
12
- class Deck
13
- # DSL method. See http://squib.readthedocs.io
14
- def yaml(opts = {}, &block)
15
- DSL::Yaml.new(__callee__).run(opts, &block)
16
- end
17
- end
18
-
19
- module DSL
20
- class Yaml
21
- include WarnUnexpectedParams
22
- attr_reader :dsl_method, :block
23
-
24
- def initialize(dsl_method)
25
- @dsl_method = dsl_method
26
- end
27
-
28
- def self.accepted_params
29
- %i( file data explode )
30
- end
31
-
32
- def run(opts,&block)
33
- warn_if_unexpected opts
34
- import_args = Args.extract_import opts
35
- importer = Squib::Import::YamlImporter.new
36
- importer.import_to_dataframe(import_args, &block)
37
- end
38
- end
39
- end
40
- end
1
+ require_relative '../args/import'
2
+ require_relative '../import/yaml_importer'
3
+ require_relative '../errors_warnings/warn_unexpected_params'
4
+
5
+ module Squib
6
+ # DSL method. See http://squib.readthedocs.io
7
+ def yaml(opts = {}, &block)
8
+ DSL::Yaml.new(__callee__).run(opts, &block)
9
+ end
10
+ module_function :yaml
11
+
12
+ class Deck
13
+ # DSL method. See http://squib.readthedocs.io
14
+ def yaml(opts = {}, &block)
15
+ DSL::Yaml.new(__callee__).run(opts, &block)
16
+ end
17
+ end
18
+
19
+ module DSL
20
+ class Yaml
21
+ include WarnUnexpectedParams
22
+ attr_reader :dsl_method, :block
23
+
24
+ def initialize(dsl_method)
25
+ @dsl_method = dsl_method
26
+ end
27
+
28
+ def self.accepted_params
29
+ %i( file data explode )
30
+ end
31
+
32
+ def run(opts,&block)
33
+ warn_if_unexpected opts
34
+ import_args = Args.extract_import opts
35
+ importer = Squib::Import::YamlImporter.new
36
+ importer.import_to_dataframe(import_args, &block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,14 +1,14 @@
1
- require 'rainbow/refinement'
2
-
3
- module Squib::WarnUnexpectedParams
4
- using Rainbow # we can colorize strings now!
5
-
6
- def warn_if_unexpected(opts, uplevel: 5)
7
- accepted_params = self.class.accepted_params
8
- unexpected = opts.keys - accepted_params
9
- unexpected.each do |key|
10
- warn "Unexpected parameter '#{key.to_s.yellow}:' to #{dsl_method.to_s.cyan}(). Accepted parameters: #{accepted_params}",
11
- uplevel: uplevel
12
- end
13
- end
14
- end
1
+ require 'rainbow/refinement'
2
+
3
+ module Squib::WarnUnexpectedParams
4
+ using Rainbow # we can colorize strings now!
5
+
6
+ def warn_if_unexpected(opts, uplevel: 5)
7
+ accepted_params = self.class.accepted_params
8
+ unexpected = opts.keys - accepted_params
9
+ unexpected.each do |key|
10
+ warn "Unexpected parameter '#{key.to_s.yellow}:' to #{dsl_method.to_s.cyan}(). Accepted parameters: #{accepted_params}",
11
+ uplevel: uplevel
12
+ end
13
+ end
14
+ end
@@ -1,14 +1,14 @@
1
- module Squib
2
- class Card
3
-
4
- # :nodoc:
5
- # @api private
6
- def background(color)
7
- use_cairo do |cc|
8
- cc.set_source_squibcolor(color)
9
- cc.paint
10
- end
11
- end
12
-
13
- end
14
- end
1
+ module Squib
2
+ class Card
3
+
4
+ # :nodoc:
5
+ # @api private
6
+ def background(color)
7
+ use_cairo do |cc|
8
+ cc.set_source_squibcolor(color)
9
+ cc.paint
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -1,115 +1,115 @@
1
- require 'forwardable'
2
- require_relative 'gradient_regex'
3
-
4
- module Squib
5
- module Graphics
6
- # Wrapper class for the Cairo context. Private.
7
- # @api private
8
- class CairoContextWrapper
9
- extend Forwardable
10
-
11
- # :nodoc:
12
- # @api private
13
- attr_accessor :cairo_cxt
14
-
15
- # :nodoc:
16
- # @api private
17
- def initialize(cairo_cxt)
18
- @cairo_cxt = cairo_cxt
19
- end
20
-
21
- def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
22
- :translate, :rotate, :move_to, :update_pango_layout, :width, :height,
23
- :show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width,
24
- :stroke, :fill, :set_source, :scale, :render_rsvg_handle, :circle,
25
- :triangle, :line_to, :operator=, :show_page, :clip, :transform, :mask,
26
- :create_pango_layout, :antialias=, :curve_to, :matrix, :matrix=,
27
- :identity_matrix, :pango_layout_path, :stroke_preserve, :target,
28
- :new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
29
- :set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative,
30
- :pseudo_blur
31
-
32
- # :nodoc:
33
- # @api private
34
- def set_source_squibcolor(arg)
35
- raise 'nil is not a valid color' if arg.nil?
36
- if match = arg.match(LINEAR_GRADIENT)
37
- x1, y1, x2, y2 = match.captures
38
- linear = Cairo::LinearPattern.new(x1.to_f, y1.to_f, x2.to_f, y2.to_f)
39
- arg.scan(STOPS).each do |color, offset|
40
- linear.add_color_stop(offset.to_f, color)
41
- end
42
- linear.matrix = matrix # match the coordinate systems - see bug 127
43
- @cairo_cxt.set_source(linear)
44
- elsif match = arg.match(RADIAL_GRADIENT)
45
- x1, y1, r1, x2, y2, r2 = match.captures
46
- radial = Cairo::RadialPattern.new(x1.to_f, y1.to_f, r1.to_f,
47
- x2.to_f, y2.to_f, r2.to_f)
48
- radial.matrix = matrix # match the coordinate systems - see bug 127
49
- arg.scan(STOPS).each do |color, offset|
50
- radial.add_color_stop(offset.to_f, color)
51
- end
52
- @cairo_cxt.set_source(radial)
53
- else
54
- @cairo_cxt.set_source_color(arg)
55
- end
56
- end
57
-
58
- # Convenience method for a common task
59
- # @api private
60
- def fill_n_stroke(draw)
61
- return stroke_n_fill(draw) if draw.stroke_strategy == :stroke_first
62
- set_source_squibcolor draw.fill_color
63
- fill_preserve
64
- set_source_squibcolor draw.stroke_color
65
- set_line_width draw.stroke_width
66
- set_line_join draw.join
67
- set_line_cap draw.cap
68
- set_dash draw.dash
69
- stroke
70
- end
71
-
72
- def stroke_n_fill(draw)
73
- return fill_n_stroke(draw) if draw.stroke_strategy == :fill_first
74
- set_source_squibcolor draw.stroke_color
75
- set_line_width draw.stroke_width
76
- set_line_join draw.join
77
- set_line_cap draw.cap
78
- set_dash draw.dash
79
- stroke_preserve
80
- set_source_squibcolor draw.fill_color
81
- fill
82
- end
83
-
84
- # Convenience method for a common task
85
- # @api private
86
- def fancy_stroke(draw)
87
- set_source_squibcolor draw.stroke_color
88
- set_line_width draw.stroke_width
89
- set_line_join draw.join
90
- set_line_cap draw.cap
91
- set_dash draw.dash
92
- stroke
93
- end
94
-
95
- def rotate_about(x, y, angle)
96
- translate(x, y)
97
- rotate(angle)
98
- translate(-x, -y)
99
- end
100
-
101
- # Flip either vertical or horizontal depending
102
- # From the cairo website: http://cairographics.org/matrix_transform/
103
- # cairo.Matrix(fx, 0, 0,
104
- # fy, cx*(1-fx), cy*(fy-1))
105
- # fx/fy = 1 means 'no flip', fx/fy = -1 are used for horizontal/vertical flip
106
- def flip(vertical, horizontal, x, y)
107
- v = vertical ? -1.0 : 1.0
108
- h = horizontal ? -1.0 : 1.0
109
- transform Cairo::Matrix.new(v, 0.0, 0.0,
110
- h, x * (1 - v), y * (1 - h))
111
- end
112
-
113
- end
114
- end
115
- end
1
+ require 'forwardable'
2
+ require_relative 'gradient_regex'
3
+
4
+ module Squib
5
+ module Graphics
6
+ # Wrapper class for the Cairo context. Private.
7
+ # @api private
8
+ class CairoContextWrapper
9
+ extend Forwardable
10
+
11
+ # :nodoc:
12
+ # @api private
13
+ attr_accessor :cairo_cxt
14
+
15
+ # :nodoc:
16
+ # @api private
17
+ def initialize(cairo_cxt)
18
+ @cairo_cxt = cairo_cxt
19
+ end
20
+
21
+ def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
22
+ :translate, :rotate, :move_to, :update_pango_layout, :width, :height,
23
+ :show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width,
24
+ :stroke, :fill, :set_source, :scale, :render_rsvg_handle, :circle,
25
+ :triangle, :line_to, :operator=, :show_page, :clip, :transform, :mask,
26
+ :create_pango_layout, :antialias=, :curve_to, :matrix, :matrix=,
27
+ :identity_matrix, :pango_layout_path, :stroke_preserve, :target,
28
+ :new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
29
+ :set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative,
30
+ :pseudo_blur
31
+
32
+ # :nodoc:
33
+ # @api private
34
+ def set_source_squibcolor(arg)
35
+ raise 'nil is not a valid color' if arg.nil?
36
+ if match = arg.match(LINEAR_GRADIENT)
37
+ x1, y1, x2, y2 = match.captures
38
+ linear = Cairo::LinearPattern.new(x1.to_f, y1.to_f, x2.to_f, y2.to_f)
39
+ arg.scan(STOPS).each do |color, offset|
40
+ linear.add_color_stop(offset.to_f, color)
41
+ end
42
+ linear.matrix = matrix # match the coordinate systems - see bug 127
43
+ @cairo_cxt.set_source(linear)
44
+ elsif match = arg.match(RADIAL_GRADIENT)
45
+ x1, y1, r1, x2, y2, r2 = match.captures
46
+ radial = Cairo::RadialPattern.new(x1.to_f, y1.to_f, r1.to_f,
47
+ x2.to_f, y2.to_f, r2.to_f)
48
+ radial.matrix = matrix # match the coordinate systems - see bug 127
49
+ arg.scan(STOPS).each do |color, offset|
50
+ radial.add_color_stop(offset.to_f, color)
51
+ end
52
+ @cairo_cxt.set_source(radial)
53
+ else
54
+ @cairo_cxt.set_source_color(arg)
55
+ end
56
+ end
57
+
58
+ # Convenience method for a common task
59
+ # @api private
60
+ def fill_n_stroke(draw)
61
+ return stroke_n_fill(draw) if draw.stroke_strategy == :stroke_first
62
+ set_source_squibcolor draw.fill_color
63
+ fill_preserve
64
+ set_source_squibcolor draw.stroke_color
65
+ set_line_width draw.stroke_width
66
+ set_line_join draw.join
67
+ set_line_cap draw.cap
68
+ set_dash draw.dash
69
+ stroke
70
+ end
71
+
72
+ def stroke_n_fill(draw)
73
+ return fill_n_stroke(draw) if draw.stroke_strategy == :fill_first
74
+ set_source_squibcolor draw.stroke_color
75
+ set_line_width draw.stroke_width
76
+ set_line_join draw.join
77
+ set_line_cap draw.cap
78
+ set_dash draw.dash
79
+ stroke_preserve
80
+ set_source_squibcolor draw.fill_color
81
+ fill
82
+ end
83
+
84
+ # Convenience method for a common task
85
+ # @api private
86
+ def fancy_stroke(draw)
87
+ set_source_squibcolor draw.stroke_color
88
+ set_line_width draw.stroke_width
89
+ set_line_join draw.join
90
+ set_line_cap draw.cap
91
+ set_dash draw.dash
92
+ stroke
93
+ end
94
+
95
+ def rotate_about(x, y, angle)
96
+ translate(x, y)
97
+ rotate(angle)
98
+ translate(-x, -y)
99
+ end
100
+
101
+ # Flip either vertical or horizontal depending
102
+ # From the cairo website: http://cairographics.org/matrix_transform/
103
+ # cairo.Matrix(fx, 0, 0,
104
+ # fy, cx*(1-fx), cy*(fy-1))
105
+ # fx/fy = 1 means 'no flip', fx/fy = -1 are used for horizontal/vertical flip
106
+ def flip(vertical, horizontal, x, y)
107
+ v = vertical ? -1.0 : 1.0
108
+ h = horizontal ? -1.0 : 1.0
109
+ transform Cairo::Matrix.new(v, 0.0, 0.0,
110
+ h, x * (1 - v), y * (1 - h))
111
+ end
112
+
113
+ end
114
+ end
115
+ end
@@ -1,28 +1,28 @@
1
- module Squib
2
- class EmbeddingUtils
3
-
4
- # Given a string and a bunch of keys, give us back a mapping of those keys
5
- # to where those keys start, and where they end (in ranges)
6
- #
7
- # See the spec for expected outputs
8
- def self.indices(str, keys)
9
- map = {}
10
- keys.each do |key|
11
- map[key] ||= []
12
- start = 0
13
- while true
14
- idx = str.index(key, start)
15
- if idx.nil?
16
- break; # done searching
17
- else
18
- idx_bytes = str[0..idx].bytesize - 1
19
- map[key] << (idx_bytes..(idx_bytes + key.size))
20
- start = idx + 1
21
- end
22
- end
23
- end
24
- return map
25
- end
26
-
27
- end
28
- end
1
+ module Squib
2
+ class EmbeddingUtils
3
+
4
+ # Given a string and a bunch of keys, give us back a mapping of those keys
5
+ # to where those keys start, and where they end (in ranges)
6
+ #
7
+ # See the spec for expected outputs
8
+ def self.indices(str, keys)
9
+ map = {}
10
+ keys.each do |key|
11
+ map[key] ||= []
12
+ start = 0
13
+ while true
14
+ idx = str.index(key, start)
15
+ if idx.nil?
16
+ break; # done searching
17
+ else
18
+ idx_bytes = str[0..idx].bytesize - 1
19
+ map[key] << (idx_bytes..(idx_bytes + key.size))
20
+ start = idx + 1
21
+ end
22
+ end
23
+ end
24
+ return map
25
+ end
26
+
27
+ end
28
+ end
@@ -1,47 +1,47 @@
1
- module Squib
2
- # @api private
3
- module Graphics
4
- STOPS = / # used to capture the stops
5
- \s* # leading whitespace is ok
6
- (\#?[\w]+) # color
7
- @ # no spaces here
8
- (\d+\.?\d*) # offset number
9
- /x
10
-
11
- LINEAR_GRADIENT = /
12
- \( \s* # coordinate 1
13
- (\d+\.?\d*) \s* # x1 number
14
- ,\s* # whitespace after comma is ok
15
- (\d+\.?\d*) \s* # y1 number
16
- \)
17
- \s* # space between coordinates is ok
18
- \( \s* # coordinate 2
19
- (\d+\.?\d*) \s* # x2 number
20
- ,\s* # whitespace after comma is ok
21
- (\d+\.?\d*) \s* # y2 number
22
- \)
23
- (#{STOPS})+ # stops
24
- \s* # trailing whitespace is ok
25
- /x
26
-
27
- RADIAL_GRADIENT = /
28
- \( \s* # coordinate 1
29
- (\d+\.?\d*) \s* # x1 number
30
- ,\s* # whitespace after comma is ok
31
- (\d+\.?\d*) \s* # y1 number
32
- ,\s* # whitespace after comma is ok
33
- (\d+\.?\d*) \s* # r1 number
34
- \)
35
- \s* # space between coordinates is ok
36
- \( \s* # coordinate 2
37
- (\d+\.?\d*) \s* # x2 number
38
- ,\s* # whitespace after comma is ok
39
- (\d+\.?\d*) \s* # y2 number
40
- ,\s* # whitespace after comma is ok
41
- (\d+\.?\d*) \s* # r2 number
42
- \)
43
- (#{STOPS})+ # stops
44
- \s* # trailing whitespace is ok
45
- /x
46
- end
47
- end
1
+ module Squib
2
+ # @api private
3
+ module Graphics
4
+ STOPS = / # used to capture the stops
5
+ \s* # leading whitespace is ok
6
+ (\#?[\w]+) # color
7
+ @ # no spaces here
8
+ (\d+\.?\d*) # offset number
9
+ /x
10
+
11
+ LINEAR_GRADIENT = /
12
+ \( \s* # coordinate 1
13
+ (\d+\.?\d*) \s* # x1 number
14
+ ,\s* # whitespace after comma is ok
15
+ (\d+\.?\d*) \s* # y1 number
16
+ \)
17
+ \s* # space between coordinates is ok
18
+ \( \s* # coordinate 2
19
+ (\d+\.?\d*) \s* # x2 number
20
+ ,\s* # whitespace after comma is ok
21
+ (\d+\.?\d*) \s* # y2 number
22
+ \)
23
+ (#{STOPS})+ # stops
24
+ \s* # trailing whitespace is ok
25
+ /x
26
+
27
+ RADIAL_GRADIENT = /
28
+ \( \s* # coordinate 1
29
+ (\d+\.?\d*) \s* # x1 number
30
+ ,\s* # whitespace after comma is ok
31
+ (\d+\.?\d*) \s* # y1 number
32
+ ,\s* # whitespace after comma is ok
33
+ (\d+\.?\d*) \s* # r1 number
34
+ \)
35
+ \s* # space between coordinates is ok
36
+ \( \s* # coordinate 2
37
+ (\d+\.?\d*) \s* # x2 number
38
+ ,\s* # whitespace after comma is ok
39
+ (\d+\.?\d*) \s* # y2 number
40
+ ,\s* # whitespace after comma is ok
41
+ (\d+\.?\d*) \s* # r2 number
42
+ \)
43
+ (#{STOPS})+ # stops
44
+ \s* # trailing whitespace is ok
45
+ /x
46
+ end
47
+ end