squib 0.16.0.pre.preview1 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 24cc3f2b97503042d0ad1a0db003e8cb585e4853389c78b49c54c036f45bf4e2
4
- data.tar.gz: aa49287f4fa01039f4ea8737e862d24637ba47142d84849e54335b44b00f4424
3
+ metadata.gz: 0ce274e1ac305556f491ca0ec5fe50ce3423aadd4eee2bbda2d143bded8590a7
4
+ data.tar.gz: 2c98fe372b7eeb24eceafe9e416c582a3e51662300d2c83dabcb3a43f99210c5
5
5
  SHA512:
6
- metadata.gz: 529665761713e33f8743356a90af15ab244e8e09ffbb4836d1aa3dd1e0398cba320ffb0e443aff355cc71604146f03865b413c3307a76d372860a07b35a8bb2b
7
- data.tar.gz: 0fe62d7d34630c98c2750e5da46d4fd5633692f6f5cab22248b4650e6f8bfa2964ac0c107f5efd847c44342ad7b2ccf41634719b6c6cf84a55154ca1bcaba405
6
+ metadata.gz: 9fe46e736b5a0acd2af24851041de586cd7fe0ab2208a6559b4cba676904ff07fadcdb2fe1d25084838634e1780b43dec32b7a3a7b4926fd173eeb6ccbdf2342
7
+ data.tar.gz: aecd5504f8dfd17518d9d675c58be8c1dfcbf5d5cff29aa9091308adbf4020e2fcadc91e4da155c69a20e397a5600c92269b8dfec306fcb87271c7342c68c04a
@@ -8,9 +8,9 @@ jobs:
8
8
  fail-fast: false
9
9
  matrix:
10
10
  os: [ubuntu, macos]
11
- ruby: [2.5, 2.6, 2.7, head]
11
+ ruby: [2.5, 2.6, 2.7, 3.0, head]
12
12
  runs-on: ${{ matrix.os }}-latest
13
- continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
13
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' || (matrix.ruby == '3.0' && matrix.os == 'macos')}}
14
14
  steps:
15
15
  - uses: actions/checkout@v2
16
16
  - uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -1,7 +1,25 @@
1
1
  # Squib CHANGELOG
2
2
  Squib follows [semantic versioning](http://semver.org).
3
3
 
4
- ## v0.16.0 / Unreleased
4
+ ## v0.17.1 / 2021-08-11
5
+
6
+ Bugs:
7
+ * Sprues now allow negative coordinates (#336)
8
+ * Documentation typos (#337)
9
+
10
+ ## v0.17.0 / 2021-07-23
11
+ Features:
12
+ * Drop shadows! The `save_png` method now supports a bunch of `shadow_` arguments that will add a drop shadow just before rendering. This is intended for using in rulebooks or marketing. Try it out by adding `shadow_radius: 8` to your save_png (#306, #264)
13
+ * Added debug methods for checking font access. `Squib.system_fonts` and `Squib.print_system_fonts` (#334)
14
+
15
+ Bugs:
16
+ * The `rows` argument is always respected in `save_sheet` (#332).
17
+
18
+ Chores:
19
+ * Bump cairo to ~1.17
20
+ * Bump classy_hash to 1.0
21
+
22
+ ## v0.16.0 / 2020-11-24
5
23
 
6
24
  Features:
7
25
  * Special custom unit: cells. A "cell" defaults to 37.5px, or 1/8in, e.g. `x: '1 cell'` means `x: 37.5`. See the docs for details.
data/RELEASE TODO.md CHANGED
@@ -9,14 +9,15 @@ Be sure to remember to do the following for releases. (Copy into a GitHub issue)
9
9
  - [ ] Bump docs/conf.py versions
10
10
  - [ ] Do a full rake locally
11
11
  - [ ] `rake sanity`, and check visually
12
- - [ ] Travis is passing on dev branch
12
+ - [ ] GitHub Actions is passing on dev branch
13
13
  - [ ] Merge master branch
14
14
  - [ ] Merge release branch
15
15
  - [ ] Push master and release branches
16
16
  - [ ] Create GitHub release tag
17
17
  - [ ] `gem push pkg/squib-x.y.z.gem`
18
- - [ ] `gem push --key github --host https://rubygems.pkg.github.com/andymeneely pkg/squib-x.y.z.gem`
19
18
  - [ ] Github milestone closed
20
- - [ ] Activate version on squib.readthedocs.org
19
+ - [ ] Activate version on squib.readthedocs.org (Versions)
20
+ - [ ] Set default version on squib.readthedocs.org (Advanced Settings)
21
21
  - [ ] Bump version.rb to the next alpha
22
+ - [ ] Check Docker build
22
23
  - [ ] Publish on BoardGameGeek thread
data/lib/squib.rb CHANGED
@@ -7,6 +7,8 @@ require_relative 'squib/version'
7
7
  require_relative 'squib/commands/cli'
8
8
  require_relative 'squib/deck'
9
9
  require_relative 'squib/card'
10
+ require_relative 'squib/system_fonts'
11
+
10
12
 
11
13
  module Squib
12
14
  using Rainbow # we can colorize strings now!
@@ -0,0 +1,39 @@
1
+ require_relative 'color_validator'
2
+
3
+ module Squib::Args
4
+ module_function def extract_drop_shadow(opts, deck)
5
+ DropShadow.new(deck.custom_colors).extract! opts, deck
6
+ end
7
+
8
+ class DropShadow
9
+ include ArgLoader
10
+ include ColorValidator
11
+
12
+ def initialize(custom_colors)
13
+ @custom_colors = custom_colors
14
+ end
15
+
16
+ def self.parameters
17
+ {
18
+ shadow_color: :black,
19
+ shadow_offset_x: 3,
20
+ shadow_offset_y: 3,
21
+ shadow_radius: nil,
22
+ shadow_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
+ [:shadow_offset_x, :shadow_offset_y, :shadow_radius, :shadow_trim]
32
+ end
33
+
34
+ def validate_shadow_color(arg, _i)
35
+ colorify(arg, @custom_colors)
36
+ end
37
+
38
+ end
39
+ end
@@ -82,14 +82,9 @@ module Squib::Args
82
82
 
83
83
  def validate_rows(arg)
84
84
  raise 'columns must be an integer' unless columns.respond_to? :to_i
85
- count = if range == :all
86
- @deck.size
87
- else
88
- count = range.to_a.length
89
- end
90
- return 1 if count <= columns
91
- return arg if arg.respond_to? :to_i
92
- (count.to_f / columns.to_f).ceil
85
+ count = (range == :all) ? @deck.size : count = range.to_a.length
86
+ return arg.to_i if arg.respond_to? :to_i
87
+ (count.to_f / columns.to_f).ceil # e.g. :infinite
93
88
  end
94
89
 
95
90
  def full_filename(i=nil)
@@ -3,49 +3,44 @@ require_relative 'unit_conversion'
3
3
  module Squib
4
4
  module Args
5
5
  module XYWHShorthands
6
- WIDTH_MINUS_REGEX = /^width\s*\-\s*/
7
- HEIGHT_MINUS_REGEX = /^height\s*\-\s*/
8
- WIDTH_DIV_REGEX = /^width\s*\/\s*/
9
- HEIGHT_DIV_REGEX = /^height\s*\/\s*/
10
- MIDDLE_PLUS_REGEX = /^middle\s*\+\s*/
11
- MIDDLE_MINUS_REGEX = /^middle\s*\-\s*/
12
6
 
7
+ MIDDLE_ONLY = /^(middle|center)\s*$/
8
+ DECK_ONLY = /^deck\s*$/
9
+ MIDDLE_MINUS_REGEX = /^(middle|center)\s*\-\s*/
10
+ MIDDLE_PLUS_REGEX = /^(middle|center)\s*\+\s*/
11
+ DECK_MINUS_REGEX = /^deck\s*\-\s*/
12
+ DECK_PLUS_REGEX = /^deck\s*\+\s*/
13
+ DECK_DIV_REGEX = /^deck\s*\/\s*/
13
14
 
14
15
  # dimension is usually either deck_width or deck_height
15
16
  def apply_shorthands(arg, deck, axis: :x)
16
17
  dimension = (axis == :x) ? deck.width : deck.height
17
18
  arg_s = arg.to_s
18
19
  case arg_s
19
- when 'middle'
20
+ when MIDDLE_ONLY
20
21
  dimension / 2.0
21
- when 'center'
22
- dimension / 2.0
23
- when 'deck'
22
+ when DECK_ONLY
24
23
  dimension
25
- when WIDTH_MINUS_REGEX # e.g. width - 1.5in
26
- n = arg_s.sub WIDTH_MINUS_REGEX, ''
27
- n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
28
- deck.width - n
29
- when HEIGHT_MINUS_REGEX # e.g. height - 1.5in
30
- n = arg_s.sub HEIGHT_MINUS_REGEX, ''
31
- n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
32
- deck.height - n
33
- when WIDTH_DIV_REGEX # e.g. width / 3
34
- n = arg_s.sub WIDTH_DIV_REGEX, ''
35
- n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
36
- deck.width / n
37
- when HEIGHT_DIV_REGEX # e.g. height / 3
38
- n = arg_s.sub HEIGHT_DIV_REGEX, ''
24
+ when MIDDLE_MINUS_REGEX # e.g. width: middle - 3
25
+ n = arg_s.sub MIDDLE_MINUS_REGEX, ''
39
26
  n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
40
- deck.height / n
27
+ dimension / 2.0 - n
41
28
  when MIDDLE_PLUS_REGEX # e.g. middle + 1.5in
42
29
  n = arg_s.sub MIDDLE_PLUS_REGEX, ''
43
- n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
30
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
44
31
  dimension / 2.0 + n
45
- when MIDDLE_MINUS_REGEX # e.g. middle - 1.5in
46
- n = arg_s.sub MIDDLE_MINUS_REGEX, ''
47
- n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
48
- dimension / 2.0 - n
32
+ when DECK_MINUS_REGEX # e.g. width: deck - 1.5in
33
+ n = arg_s.sub DECK_MINUS_REGEX, ''
34
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
35
+ dimension - n
36
+ when DECK_PLUS_REGEX # e.g. deck + 1.5in (which is weird but ok)
37
+ n = arg_s.sub DECK_PLUS_REGEX, ''
38
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
39
+ dimension + n
40
+ when DECK_DIV_REGEX # e.g. width: deck/3
41
+ n = arg_s.sub DECK_DIV_REGEX, ''
42
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
43
+ dimension / n
49
44
  else
50
45
  arg
51
46
  end
@@ -1,5 +1,7 @@
1
1
  require_relative '../errors_warnings/warn_unexpected_params'
2
-
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/save_batch'
4
+ require_relative '../args/drop_shadow'
3
5
 
4
6
  module Squib
5
7
  class Deck
@@ -24,24 +26,23 @@ module Squib
24
26
  range
25
27
  dir prefix suffix count_format
26
28
  rotate trim trim_radius
29
+ shadow_offset_x shadow_offset_y shadow_radius shadow_color shadow_trim
27
30
  )
28
31
  end
29
32
 
30
33
  def run(opts)
31
34
  warn_if_unexpected opts
32
- Dir.chdir(deck.img_dir) do
33
- range = Args.extract_range opts, deck
34
- batch = Args.extract_save_batch opts, deck
35
- @bar.start("Saving PNGs to #{batch.summary}", deck.size) do |bar|
36
- range.map do |i|
37
- deck.cards[i].save_png(batch[i])
38
- bar.increment
39
- end
40
-
35
+ range = Args.extract_range opts, deck
36
+ batch = Args.extract_save_batch opts, deck
37
+ shadow = Args.extract_drop_shadow opts, deck
38
+ @bar.start("Saving PNGs to #{batch.summary}", deck.size) do |bar|
39
+ range.map do |i|
40
+ deck.cards[i].save_png(batch[i], shadow[i])
41
+ bar.increment
41
42
  end
42
43
  end
43
-
44
44
  end
45
45
  end
46
+
46
47
  end
47
48
  end
@@ -20,12 +20,14 @@ module Squib
20
20
 
21
21
  def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
22
22
  :translate, :rotate, :move_to, :update_pango_layout, :width, :height,
23
- :show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width, :stroke, :fill,
24
- :set_source, :scale, :render_rsvg_handle, :circle, :triangle, :line_to,
25
- :operator=, :show_page, :clip, :transform, :mask, :create_pango_layout,
26
- :antialias=, :curve_to, :matrix, :matrix=, :identity_matrix, :pango_layout_path,
27
- :stroke_preserve, :target, :new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
28
- :set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative
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
29
31
 
30
32
  # :nodoc:
31
33
  # @api private
@@ -1,12 +1,14 @@
1
+ require_relative 'cairo_context_wrapper'
2
+
1
3
  module Squib
2
4
  class Card
3
5
 
4
6
  # :nodoc:
5
7
  # @api private
6
- def save_png(batch)
7
- surface = if preprocess_save?(batch)
8
+ def save_png(batch, shadow)
9
+ surface = if preprocess_save?(batch, shadow)
8
10
  w, h = compute_dimensions(batch.rotate, batch.trim)
9
- preprocessed_save(w, h, batch)
11
+ preprocessed_save(w, h, batch, shadow)
10
12
  else
11
13
  @cairo_surface
12
14
  end
@@ -15,8 +17,8 @@ module Squib
15
17
 
16
18
  # :nodoc:
17
19
  # @api private
18
- def preprocess_save?(batch)
19
- batch.rotate != false || batch.trim > 0
20
+ def preprocess_save?(batch, shadow)
21
+ batch.rotate != false || batch.trim > 0 || !(shadow.shadow_radius.nil?)
20
22
  end
21
23
 
22
24
  def compute_dimensions(rotate, trim)
@@ -27,25 +29,62 @@ module Squib
27
29
  end
28
30
  end
29
31
 
30
- def preprocessed_save(width, height, batch)
31
- new_cc = Cairo::Context.new(Cairo::ImageSurface.new(width, height))
32
+ def preprocessed_save(w, h, batch, shadow)
33
+ new_cc = Cairo::Context.new(Cairo::ImageSurface.new(w, h))
32
34
  trim_radius = batch.trim_radius
33
35
  if batch.rotate != false
34
- new_cc.translate(width * 0.5, height * 0.5)
35
- new_cc.rotate(batch.angle)
36
- new_cc.translate(height * -0.5, width * -0.5)
37
- new_cc.rounded_rectangle(0, 0, height, width, trim_radius, trim_radius)
36
+ new_cc.translate w * 0.5, h * 0.5
37
+ new_cc.rotate batch.angle
38
+ new_cc.translate h * -0.5, w * -0.5
39
+ new_cc.rounded_rectangle(0, 0, h, w, trim_radius, trim_radius)
38
40
  else
39
- new_cc.rounded_rectangle(0, 0, width, height, trim_radius, trim_radius)
41
+ new_cc.rounded_rectangle(0, 0, w, h, trim_radius, trim_radius)
40
42
  end
41
43
  new_cc.clip
42
44
  new_cc.set_source(@cairo_surface, -batch.trim, -batch.trim)
43
45
  new_cc.paint
46
+ new_cc.reset_clip
47
+ new_cc = drop_shadow(new_cc, shadow, batch) unless shadow.shadow_radius.nil?
44
48
  return new_cc.target
45
49
  end
46
50
 
51
+ # pseudo-blur behave weirdly with a radius of 0 - wrapping
52
+ def blur(cc, r, &block)
53
+ if r == 0
54
+ yield(block)
55
+ else
56
+ cc.pseudo_blur(r, &block)
57
+ end
58
+ end
59
+
60
+ def drop_shadow(cc, s, batch)
61
+ off_x = s.shadow_offset_x
62
+ off_y = s.shadow_offset_y
63
+ s_trim = s.shadow_trim
64
+ s_rad = s.shadow_radius
65
+ new_w = cc.target.width + off_x + 3 * s_rad - (2 * s_trim)
66
+ new_h = cc.target.height + off_y + 3 * s_rad - (2 * s_trim)
67
+ new_cc = Squib::Graphics::CairoContextWrapper.new(
68
+ Cairo::Context.new(Cairo::ImageSurface.new(new_w, new_h)))
69
+ blur(new_cc, s_rad) do
70
+ # fill in with shadow color
71
+ new_cc.set_source_squibcolor s.shadow_color
72
+ new_cc.rectangle 0, 0, new_cc.target.width, new_cc.target.height
73
+ new_cc.fill
74
+ # then, paint but blend with :dest_in to get a shadow-shaped drawing
75
+ new_cc.set_source cc.target, s_rad + off_x, s_rad + off_y
76
+ new_cc.operator = :dest_in # see https://www.cairographics.org/operators/
77
+ new_cc.paint
78
+ end
79
+ new_cc.set_source cc.target, s_rad, s_rad
80
+ new_cc.operator = :over
81
+ new_cc.paint
82
+ return new_cc
83
+ end
84
+
47
85
  def write_png(surface, i, b)
48
- surface.write_to_png("#{b.dir}/#{b.prefix}#{b.count_format % i}#{b.suffix}.png")
86
+ filename = "#{b.dir}/#{b.prefix}#{b.count_format % i}#{b.suffix}.png"
87
+ surface.write_to_png filename
49
88
  end
50
89
 
51
90
  end
@@ -1,7 +1,8 @@
1
1
  module Squib
2
2
  module Sprues
3
3
  UNIT_REGEX = /^(\d*[.])?\d+(in|cm|mm)$/
4
- ROTATE_REGEX = /^(\d*[.])?\d+(deg|rad)?$/
4
+ COORD_REGEX = /^\-?(\d*[.])?\d+(in|cm|mm)$/
5
+ ROTATE_REGEX = /^\-?(\d*[.])?\d+(deg|rad)?$/
5
6
  SCHEMA = {
6
7
  'sheet_width' => UNIT_REGEX,
7
8
  'sheet_height' => UNIT_REGEX,
@@ -35,8 +36,8 @@ module Squib
35
36
  }]]
36
37
  },
37
38
  'cards' => [[{
38
- 'x' => UNIT_REGEX,
39
- 'y' => UNIT_REGEX,
39
+ 'x' => COORD_REGEX,
40
+ 'y' => COORD_REGEX,
40
41
  'rotate' => [
41
42
  :optional, Numeric,
42
43
  ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround),
@@ -0,0 +1,17 @@
1
+ require 'pango'
2
+ module Squib
3
+
4
+ # List all system fonts that Cairo/Pango can see
5
+ # Wow this call was convoluted...
6
+ # Returns array of strings with the names of fonts
7
+ module_function def system_fonts
8
+ cc = Cairo::Context.new(Cairo::ImageSurface.new(0,0)) # empty image
9
+ cc.create_pango_layout.context.families.map {|f| f.name }
10
+ end
11
+
12
+ # Prints out the system fonts in sorted order
13
+ module_function def print_system_fonts
14
+ puts "== DEBUG: Squib knows about these fonts =="
15
+ puts system_fonts.sort
16
+ end
17
+ end
data/lib/squib/version.rb CHANGED
@@ -6,5 +6,6 @@ module Squib
6
6
  # Most of the time this is in the alpha of the next release.
7
7
  # e.g. v0.0.5a is on its way to becoming v0.0.5
8
8
  #
9
- VERSION = '0.16.0-preview1'
9
+ VERSION = '0.17.1'
10
10
  end
11
+
@@ -50,3 +50,13 @@ Squib::Deck.new(width: 825, height: 1125, cards: 16) do
50
50
  columns: 2, rows: 1,
51
51
  margin: 75, gap: 5, trim: 37
52
52
  end
53
+
54
+ Squib::Deck.new(width: 100, height: 100, cards: 3) do
55
+ background color: :grey
56
+ text str: 'Hi', font: 'Arial 18'
57
+
58
+ # Test bug 332.
59
+ # When we only have 3 cards but want a 2x4 grid with lots of empty spaces.
60
+ # Buggy behavior was to revert to 1 row and not respect the rows arg.
61
+ save_sheet prefix: 'save_sheet_bug332_', rows: 2, columns: 4
62
+ end
@@ -0,0 +1,72 @@
1
+ require 'squib'
2
+ # The save_png method supports drop shadows on the final save
3
+ # This is useful for when you want to generate images for your rulebook
4
+
5
+ Squib::Deck.new(width: 100, height: 150) do
6
+ background color: '#abc'
7
+ svg file: '../spanner.svg',
8
+ x: 'middle - 25', y: 'middle - 25',
9
+ width: 50, height: 50
10
+
11
+ # Shadows off by default, i.e. shadow_radius is nil
12
+ # So our final dimensions are 100 - 2*15 and 150-2*15
13
+ save_png prefix: 'no_shadow_', trim: 15, trim_radius: 15
14
+
15
+ # Here's a nice-looking drop shadow
16
+ # Defaults are designed to be generally good, so I recommend just
17
+ # trying out a shadow_radius of 3 to 10 and see how it looks first
18
+ save_png prefix: 'with_shadow_', trim: 15, trim_radius: 15,
19
+ shadow_radius: 8,
20
+ shadow_offset_x: 3, shadow_offset_y: 3, # about r / 2.5 looks good
21
+ shadow_trim: 2.5, # about r/ 3 looks good
22
+ shadow_color: '#101010aa' #tip: start the shadow color kinda transparent
23
+
24
+ # Don't want a blur? Use a radius of 0
25
+ save_png prefix: 'no_blur_', trim: 15, trim_radius: 15,
26
+ shadow_radius: 0
27
+
28
+ # Ok this next stop is crazytown, but it does give you ultimate control
29
+ # Remember that all Squib colors can also be gradients.
30
+ # They can be clunky but they do work here.
31
+ # - x,y's are centered in the card itself
32
+ # - stops go from fully empty to fully black
33
+ # - we need to still turn on radius to get the effect
34
+ # - but, this makes the upper-left corner not have a glowing effect and
35
+ # have a harder edge, which (to my eye at least) feels more realistic
36
+ # since the card would obscure the upper-left shadow at that angle
37
+ # - this also allows you have a larger, softer blur without making it look
38
+ # like it's glowing
39
+ #
40
+ # Oh just because it's easier to write we can use a ruby heredoc
41
+ save_png prefix: 'gradient_blur_', trim: 15, trim_radius: 15,
42
+ shadow_radius: 10,
43
+ shadow_color: <<~EOS
44
+ (25,25)
45
+ (175,175)
46
+ #0000@0.0
47
+ #000f@1.0
48
+ EOS
49
+
50
+ # This one looks weird I know but it's for regression testing
51
+ save_png prefix: 'with_shadow_test_',
52
+ trim: 15, trim_radius: 15, rotate: :clockwise,
53
+ shadow_offset_x: 5, shadow_offset_y: 25, shadow_radius: 10,
54
+ shadow_trim: 10,
55
+ shadow_color: '#123'
56
+ end
57
+
58
+ Squib::Deck.new(width:50, height: 50) do
59
+
60
+ # What if we had a transparent card but just some shapes?
61
+ # Like chits or something
62
+
63
+ # background defaults to fully transparent here
64
+
65
+ png file: 'doodle.png'
66
+
67
+ save_png prefix: 'transparent_bg_shadow_',
68
+ shadow_radius: 2,
69
+ shadow_offset_x: 2, shadow_offset_y: 2,
70
+ shadow_color: :black
71
+
72
+ end
@@ -0,0 +1,7 @@
1
+ require_relative '../../lib/squib'
2
+
3
+ Squib::Deck.new(width: 100, height: 100, cards: 3) do
4
+ background color: :grey
5
+ text str: 'Hello', font: 'Sans Bold 10'
6
+ save_sheet sprue: 'my_sprues/negatives.yml', prefix: 'sprue_negatives_'
7
+ end
@@ -0,0 +1,14 @@
1
+ # require 'squib'
2
+ require_relative '../../lib/squib'
3
+
4
+ # Per issue #334, sometimes Pango doesn't find the font file you want
5
+ # Pango requires fonts to be installed on the system, but sometimes the
6
+ # font name is not obvious. e.g. "Foo Regular" might be actually named "Foo"
7
+ # Use these methods to debug this problem
8
+
9
+ # Usually you would just run this method to see what fonts are installed
10
+ # This is commented out to make our test cases
11
+ # Squib.print_system_fonts
12
+
13
+ Squib.system_fonts.include? 'Open Sans' # checks if we have Open Sans installed
14
+ # Note: does nothing since it's just a check
@@ -19,7 +19,7 @@ Squib::Deck.new(width: '1.5in', height: '1.5in') do
19
19
  # Technically, the "cell" is actually a "unit", so you can even combine
20
20
  # with xywh shorhands!!
21
21
  rect fill_color: :red,
22
- x: 'middle + 0.5c', y: 'height - 1.5c',
22
+ x: 'middle + 0.5c', y: 'deck - 1.5c',
23
23
  width: '1c', height: '1c'
24
24
 
25
25
  # And, unlike xywh shorthands, this applies basically everywhere we support
@@ -20,14 +20,13 @@ Squib::Deck.new(width: '0.5in', height: '0.25in') do
20
20
 
21
21
  # We can also do width-, height-, width/, height/
22
22
  rect x: 20, y: 5, stroke_color: :green,
23
- width: 'width - 0.1in', height: 10
23
+ width: 'deck - 0.1in', height: 10
24
24
 
25
- rect x: 10, y: 50, width: 10, height: 'height / 3',
25
+ rect x: 10, y: 50, width: 10, height: 'deck / 3',
26
26
  stroke_color: :purple
27
27
 
28
28
  # And middle+/-
29
-
30
- rect x: 'middle + 0.1in', y: 'middle - 0.1in',
29
+ rect x: 'middle + 0.1in', y: 'center - 0.1in',
31
30
  width: '0.1in', height: '0.1in', fill_color: :blue
32
31
 
33
32
  # Layouts apply this too.
data/squib.gemspec CHANGED
@@ -31,18 +31,18 @@ Gem::Specification.new do |spec|
31
31
  spec.test_files = spec.files.grep(/^(spec|samples|docs|benchmarks)\//)
32
32
  spec.require_paths = ['lib']
33
33
 
34
- spec.add_runtime_dependency 'cairo', '~> 1.16'
35
- spec.add_runtime_dependency 'classy_hash', '0.2.1'
34
+ spec.add_runtime_dependency 'cairo', '~> 1.17'
35
+ spec.add_runtime_dependency 'classy_hash', '1.0.0'
36
36
  spec.add_runtime_dependency 'gio2', '~> 3.4'
37
37
  spec.add_runtime_dependency 'gobject-introspection', '~> 3.4'
38
38
  spec.add_runtime_dependency 'highline', '2.0.3'
39
39
  spec.add_runtime_dependency 'mercenary', '0.4.0'
40
- spec.add_runtime_dependency 'nokogiri', '~> 1.10'
40
+ spec.add_runtime_dependency 'nokogiri', '~> 1.11'
41
41
  spec.add_runtime_dependency 'pango', '~> 3.4'
42
42
  spec.add_runtime_dependency 'rainbow', '~> 3.0'
43
43
  spec.add_runtime_dependency 'roo', '~> 2.8'
44
44
  spec.add_runtime_dependency 'rsvg2', '~> 3.4'
45
- spec.add_runtime_dependency 'ruby-progressbar', '~> 1.10'
45
+ spec.add_runtime_dependency 'ruby-progressbar', '~> 1.11'
46
46
 
47
47
  spec.add_development_dependency 'activesupport'
48
48
  spec.add_development_dependency 'bundler'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0.pre.preview1
4
+ version: 0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Meneely
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-19 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cairo
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.16'
19
+ version: '1.17'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.16'
26
+ version: '1.17'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: classy_hash
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.1
33
+ version: 1.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.1
40
+ version: 1.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: gio2
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.10'
103
+ version: '1.11'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.10'
110
+ version: '1.11'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pango
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +170,14 @@ dependencies:
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '1.10'
173
+ version: '1.11'
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '1.10'
180
+ version: '1.11'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: activesupport
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -358,6 +358,7 @@ extra_rdoc_files:
358
358
  - samples/saves/_save_filenames.rb
359
359
  - samples/saves/_save_pdf.rb
360
360
  - samples/saves/_showcase.rb
361
+ - samples/shadows/_shadow.rb
361
362
  - samples/shapes/_draw_shapes.rb
362
363
  - samples/shapes/_proofs.rb
363
364
  - samples/sprues/_advanced_sprues.rb
@@ -365,7 +366,9 @@ extra_rdoc_files:
365
366
  - samples/sprues/_fold_sheet.rb
366
367
  - samples/sprues/_hex_tiles.rb
367
368
  - samples/sprues/_mints.rb
369
+ - samples/sprues/_negative_coords.rb
368
370
  - samples/sprues/_sprue_example.rb
371
+ - samples/system_font_debug/_list_fonts.rb
369
372
  - samples/text/bug134.rb
370
373
  - samples/text/_embed_text.rb
371
374
  - samples/text/_text.rb
@@ -396,6 +399,7 @@ files:
396
399
  - lib/squib/args/csv_opts.rb
397
400
  - lib/squib/args/dir_validator.rb
398
401
  - lib/squib/args/draw.rb
402
+ - lib/squib/args/drop_shadow.rb
399
403
  - lib/squib/args/embed_adjust.rb
400
404
  - lib/squib/args/embed_key.rb
401
405
  - lib/squib/args/hand_special.rb
@@ -517,6 +521,7 @@ files:
517
521
  - lib/squib/sprues/invalid_sprue_definition.rb
518
522
  - lib/squib/sprues/sprue.rb
519
523
  - lib/squib/sprues/sprue_schema.rb
524
+ - lib/squib/system_fonts.rb
520
525
  - lib/squib/version.rb
521
526
  - samples/autoscale_font/_autoscale_font.rb
522
527
  - samples/backend/_backend.rb
@@ -551,6 +556,7 @@ files:
551
556
  - samples/saves/_save_pdf.rb
552
557
  - samples/saves/_saves.rb
553
558
  - samples/saves/_showcase.rb
559
+ - samples/shadows/_shadow.rb
554
560
  - samples/shapes/_draw_shapes.rb
555
561
  - samples/shapes/_proofs.rb
556
562
  - samples/sprues/_advanced_sprues.rb
@@ -558,7 +564,9 @@ files:
558
564
  - samples/sprues/_fold_sheet.rb
559
565
  - samples/sprues/_hex_tiles.rb
560
566
  - samples/sprues/_mints.rb
567
+ - samples/sprues/_negative_coords.rb
561
568
  - samples/sprues/_sprue_example.rb
569
+ - samples/system_font_debug/_list_fonts.rb
562
570
  - samples/text/_embed_text.rb
563
571
  - samples/text/_text.rb
564
572
  - samples/text/_text_options.rb
@@ -583,13 +591,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
583
591
  version: 2.5.0
584
592
  required_rubygems_version: !ruby/object:Gem::Requirement
585
593
  requirements:
586
- - - ">"
594
+ - - ">="
587
595
  - !ruby/object:Gem::Version
588
- version: 1.3.1
596
+ version: '0'
589
597
  requirements:
590
598
  - On Windows, you need the Ruby+DevKit. See https://rubyinstaller.org/downloads
591
- rubygems_version: 3.1.4
592
- signing_key:
599
+ rubygems_version: 3.0.3
600
+ signing_key:
593
601
  specification_version: 2
594
602
  summary: A Ruby DSL for prototyping card games
595
603
  test_files:
@@ -626,6 +634,7 @@ test_files:
626
634
  - samples/saves/_save_pdf.rb
627
635
  - samples/saves/_saves.rb
628
636
  - samples/saves/_showcase.rb
637
+ - samples/shadows/_shadow.rb
629
638
  - samples/shapes/_draw_shapes.rb
630
639
  - samples/shapes/_proofs.rb
631
640
  - samples/sprues/_advanced_sprues.rb
@@ -633,7 +642,9 @@ test_files:
633
642
  - samples/sprues/_fold_sheet.rb
634
643
  - samples/sprues/_hex_tiles.rb
635
644
  - samples/sprues/_mints.rb
645
+ - samples/sprues/_negative_coords.rb
636
646
  - samples/sprues/_sprue_example.rb
647
+ - samples/system_font_debug/_list_fonts.rb
637
648
  - samples/text/_embed_text.rb
638
649
  - samples/text/_text.rb
639
650
  - samples/text/_text_options.rb