squib 0.16.0 → 0.18.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d121338a0d8d7967443268aaf0e85f9bfcdfa64da4b3f78beafd13c5b6d31de
4
- data.tar.gz: e7f94c3685bcad4537eb19065e31d2d277561562baf71485e3ce2ab041d316a7
3
+ metadata.gz: 8e5921a89334684b7770be1b6d85ef150fd02f5c1b305ae795c0b349ac3e8a6d
4
+ data.tar.gz: bd29c5c8b101957a1ade535d14a128137185c002195d832d349e51c0aff9fcf4
5
5
  SHA512:
6
- metadata.gz: '06290d3f269f0b19349c9c66306682b9323f21da674d8e37515bb97b98b7cd51ef9d95cfcf591d8fcf6192449d6b5aa39fa7efc11aaed9078e626747b8a06121'
7
- data.tar.gz: 86ffe77a0a120e18c0287a725e2ba4ef0e5dceb79359784e6ab0965559473e7c8533dd1dc9b99eb7d0e2d7d280d5c9b1ec3f8229b022ecc6dab18942f94f6544
6
+ metadata.gz: 021b8f98bab301f65e300523447fb4fc172cc12df0d7436da200e716e6dfd87d843b11ac3e07bd8496319eaa62803c59ad1a5ed88d9dc830e8858f99c4288366
7
+ data.tar.gz: 8c3d7a1b44ac551ce24716ab6da853e1bfcacac55c5ce8ba13a847990c863860cb5bc186832812d8b14aacc774ee96bf3d41057cd65ee966cbad1dda130681e7
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report something that seems wrong
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. My code looks like this...
16
+ 2. When I run it like this...
17
+ 3. I see this error...
18
+
19
+ **Expected behavior**
20
+ A clear and concise description of what you expected to happen.
21
+
22
+ **Screenshots**
23
+ We love screenshots!
24
+ * Windows: `Print Screen` key and then `ctrl+v` directly into GitHub issues here.
25
+ * Shift + Command + 3, then `command+v` directly into GitHub issues here.
26
+
27
+ **Environment**
28
+ - OS: (e.g. Windows 11)
29
+ - Ruby version (e.g. 2.7, 3.0)
30
+
31
+ **Additional context**
32
+ Add any other context about the problem here.
33
+
34
+ **Check the following:**
35
+
36
+ - [ ] I have updated Squib to the latest version.
37
+ - [ ] I have checked the Squib issues backlog for something similar
38
+ - [ ] I have attempted to make a minimal script demonstrating my problem
39
+ - [ ] I have reviewed the [Squib Docs](https://squib.readthedocs.io/) and there's still a problem
@@ -0,0 +1,22 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen. Make an example of what you want the syntax to look like.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
21
+
22
+ - [ ] I might be interested in implementing this myself
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: Help Wanted - USE GITHUB DISCUSSIONS INSTEAD
3
+ about: Need help doing something in Squib? We prefer you use the (new!) Discussions tab
4
+ title: Help Wanted - USE GITHUB DISCUSSIONS INSTEAD
5
+ labels: help wanted
6
+ assignees: andymeneely
7
+ ---
8
+
9
+ Need help doing something in Squib? We prefer you use the (new!) Discussions tab
10
+
11
+ We prefer that GitHub issues be used for features or bugs.
12
+
13
+
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: Release TODO list
3
+ about: Use this checklist when we release
4
+ title: Release v0.XYZ
5
+ labels: release
6
+ assignees: andymeneely
7
+ ---
8
+
9
+ Be sure to remember to do the following for releases.
10
+
11
+ - [ ] CHANGELOG is written for all new changes
12
+ - [ ] README is updated
13
+ - [ ] Samples are updated
14
+ - [ ] Are all the dependencies up to date?
15
+ - [ ] Check `sample_regression_spec.rb` regression tests are all enabled (i.e. `overwrite_sample` is commented out)
16
+ - [ ] Bump version.rb
17
+ - [ ] Bump docs/conf.py versions
18
+ - [ ] Do a full rake locally
19
+ - [ ] `rake sanity`, and check visually
20
+ - [ ] GitHub Actions is passing on dev branch
21
+ - [ ] Merge master branch
22
+ - [ ] Merge release branch
23
+ - [ ] Push master and release branches
24
+ - [ ] Create GitHub release tag
25
+ - [ ] `gem push pkg/squib-x.y.z.gem`
26
+ - [ ] Github milestone closed
27
+ - [ ] Activate version on squib.readthedocs.org (Versions)
28
+ - [ ] Set default version on squib.readthedocs.org (Advanced Settings)
29
+ - [ ] Bump version.rb to the next alpha
30
+ - [ ] Publish on BoardGameGeek thread
31
+ - [ ] Check Docker build on Dockerhub: https://hub.docker.com/repository/docker/andymeneely/squib
32
+ - [ ] Check Docker docker pull: docker pull andymeneely/squib:latest
33
+ - [ ] Check Docker build locally in samples: docker run --rm -v "%cd%":/usr/src/app andymeneely/squib:latest ruby basic
34
+ - [ ] Anything else to add to this checklist?
@@ -0,0 +1,13 @@
1
+ ### Motivation
2
+
3
+ *Replace this line with why you are making this change.*
4
+
5
+ ### Have you...
6
+
7
+ - [ ] Written a sample in `_samples`?
8
+ - [ ] Updated documentation in the `docs/` folder?
9
+ - [ ] Linked this PR to an issue?
10
+ - [ ] Written any automated tests?
11
+ - [ ] Refactored your code to be maintainable?
12
+
13
+ The above things are not required, but appreciated.
@@ -1,6 +1,6 @@
1
1
  name: Squib Unit Tests
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  test:
@@ -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.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 == '3.0' && matrix.os == 'macos')}}
14
14
  steps:
15
15
  - uses: actions/checkout@v2
16
16
  - uses: ruby/setup-ruby@v1
@@ -0,0 +1,4 @@
1
+ {
2
+ "restructuredtext.confPath": "${workspaceFolder}\\docs",
3
+ "restructuredtext.linter.disabled": true
4
+ }
data/CHANGELOG.md CHANGED
@@ -1,6 +1,44 @@
1
1
  # Squib CHANGELOG
2
2
  Squib follows [semantic versioning](http://semver.org).
3
3
 
4
+ ## v0.18.0 / Unreleased
5
+
6
+ Features:
7
+ * Placeholders! Missing images to `svg` and `png` can be replaced by a `placeholder` (#339)
8
+ * New config option: `img_missing`. When an image is missing, warn or error to the console (#339)
9
+ * `save_sheet` learned how to `rotate` individual images! (#301)
10
+
11
+ Compatibility:
12
+ * Because of the features above, the new default behavior is to warn instead of errors on a missing file
13
+ * Ruby 2.7 is officially our minimum Ruby, since Ruby 2.6 will EOL in about six months from now
14
+
15
+ ## v0.17.1 / 2021-09-07
16
+
17
+ Bugs:
18
+ * Fix frozen string error on `Squib.xlsx` import when stripping newlines is enabled
19
+ * `save_sheet` works with `rtl` and `trim` altogether properly now.
20
+
21
+ Chores:
22
+ * Added autoloading for various slow-loading libraries, speeding up initial `require`
23
+
24
+ ## v0.17.1 / 2021-08-11
25
+
26
+ Bugs:
27
+ * Sprues now allow negative coordinates (#336)
28
+ * Documentation typos (#337)
29
+
30
+ ## v0.17.0 / 2021-07-23
31
+ Features:
32
+ * 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)
33
+ * Added debug methods for checking font access. `Squib.system_fonts` and `Squib.print_system_fonts` (#334)
34
+
35
+ Bugs:
36
+ * The `rows` argument is always respected in `save_sheet` (#332).
37
+
38
+ Chores:
39
+ * Bump cairo to ~1.17
40
+ * Bump classy_hash to 1.0
41
+
4
42
  ## v0.16.0 / 2020-11-24
5
43
 
6
44
  Features:
data/README.md CHANGED
@@ -31,7 +31,7 @@ Wanna see more? Check out the website: http://andymeneely.github.io/squib/
31
31
 
32
32
  ## Installation
33
33
 
34
- Squib requires Ruby 2.5 or later.
34
+ Squib requires Ruby 2.7 or later.
35
35
 
36
36
  Install it yourself with:
37
37
 
data/bin/squib CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'squib'
3
+ require 'squib/commands/cli'
3
4
 
4
5
  Squib::CLI.new.run
@@ -126,4 +126,13 @@ module Squib::Args::ArgLoader
126
126
  self
127
127
  end
128
128
 
129
+ # Return the deck's configuration
130
+ # This keeps the @deck local to this mixin instead of forcing args classes
131
+ # to "know" that @deck works.
132
+ #
133
+ # It also makes unit testing easier. Sue me.
134
+ def deck_conf
135
+ @deck.conf
136
+ end
137
+
129
138
  end
@@ -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
@@ -13,7 +13,10 @@ module Squib::Args
13
13
  end
14
14
 
15
15
  def self.parameters
16
- { file: nil }
16
+ {
17
+ file: nil,
18
+ placeholder: nil
19
+ }
17
20
  end
18
21
 
19
22
  def self.expanding_parameters
@@ -24,10 +27,29 @@ module Squib::Args
24
27
  [] # none of them
25
28
  end
26
29
 
27
- def validate_file(arg, _i)
30
+ def validate_file(arg, i)
28
31
  return nil if arg.nil?
29
- raise "File #{File.expand_path(arg)} does not exist!" unless File.exists?(arg)
30
- File.expand_path(arg)
32
+ return File.expand_path(arg) if File.exists?(arg)
33
+ return File.expand_path(placeholder[i]) if File.exists?(placeholder[i].to_s)
34
+
35
+ case deck_conf.img_missing.to_sym
36
+ when :error
37
+ raise "File #{File.expand_path(arg)} does not exist!"
38
+ when :warn
39
+ Squib.logger.warn "File #{File.expand_path(arg)} does not exist!"
40
+ end
41
+ return nil # the silent option - as if nil in the first place
42
+ end
43
+
44
+ def validate_placeholder(arg, _i)
45
+ # What if they specify placeholder, but it doesn't exist?
46
+ # ...always warn... that's probably a mistake they made
47
+ unless arg.nil? || File.exists?(arg)
48
+ msg = "Image placeholder #{File.expand_path(arg)} does not exist!"
49
+ Squib.logger.warn msg
50
+ return nil
51
+ end
52
+ return arg
31
53
  end
32
54
  end
33
55
  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)
data/lib/squib/conf.rb CHANGED
@@ -23,6 +23,7 @@ module Squib
23
23
  'dir' => '_output',
24
24
  'hint' => :none,
25
25
  'img_dir' => '.',
26
+ 'img_missing' => :warn,
26
27
  'progress_bars' => false,
27
28
  'prefix' => 'card_',
28
29
  'ldquote' => "\u201C", # UTF8 chars
@@ -74,6 +75,10 @@ module Squib
74
75
  @config_hash['img_dir']
75
76
  end
76
77
 
78
+ def img_missing
79
+ @config_hash['img_missing'].to_sym
80
+ end
81
+
77
82
  def text_hint
78
83
  @config_hash['text_hint']
79
84
  end
data/lib/squib/dsl/png.rb CHANGED
@@ -31,6 +31,7 @@ module Squib
31
31
  crop_corner_radius crop_corner_x_radius crop_corner_y_radius
32
32
  flip_horizontal flip_vertical
33
33
  range layout
34
+ placeholder
34
35
  )
35
36
  end
36
37
 
@@ -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,6 +26,7 @@ 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
 
@@ -31,9 +34,10 @@ module Squib
31
34
  warn_if_unexpected opts
32
35
  range = Args.extract_range opts, deck
33
36
  batch = Args.extract_save_batch opts, deck
37
+ shadow = Args.extract_drop_shadow opts, deck
34
38
  @bar.start("Saving PNGs to #{batch.summary}", deck.size) do |bar|
35
39
  range.map do |i|
36
- deck.cards[i].save_png(batch[i])
40
+ deck.cards[i].save_png(batch[i], shadow[i])
37
41
  bar.increment
38
42
  end
39
43
  end
@@ -30,7 +30,7 @@ module Squib
30
30
  range sprue
31
31
  columns rows rtl
32
32
  dir prefix count_format suffix
33
- margin gap trim trim_radius
33
+ margin gap trim trim_radius rotate
34
34
  )
35
35
  end
36
36
 
data/lib/squib/dsl/svg.rb CHANGED
@@ -33,6 +33,7 @@ module Squib
33
33
  flip_horizontal flip_vertical angle
34
34
  id force_id data
35
35
  range layout
36
+ placeholder
36
37
  )
37
38
  end
38
39
 
@@ -23,6 +23,7 @@ module Squib
23
23
  id force_id data
24
24
  flip_horizontal flip_vertical
25
25
  alpha angle blend mask
26
+ placeholder
26
27
  )
27
28
  end
28
29
 
@@ -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
@@ -4,13 +4,13 @@ module Squib
4
4
  # :nodoc:
5
5
  # @api private
6
6
  def render_sheet(range, batch, sheet)
7
- sheet_width = (sheet.columns * (@width + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin)
8
- sheet_height = (sheet.rows * (@height + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin)
7
+ rotate = batch.rotate.any? true # either rotate all or none
8
+ w,h,sheet_width,sheet_height = compute_dimensions(sheet, rotate)
9
9
  cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height))
10
10
  num_this_sheet = 0
11
11
  sheet_num = 0
12
12
  y = sheet.margin
13
- x = sheet.rtl ? (sheet_width - sheet.margin - sheet.gap - @width) : sheet.margin
13
+ x = sheet.rtl ? rtl_start_x(sheet_width, sheet, w) : sheet.margin
14
14
  @progress_bar.start("Saving PNG sheet to #{batch.summary}", @cards.size + 1) do |bar|
15
15
  range.each do |i|
16
16
  if num_this_sheet >= (sheet.columns * sheet.rows) # new sheet
@@ -20,17 +20,19 @@ module Squib
20
20
  num_this_sheet = 0
21
21
  sheet_num += 1
22
22
  y = sheet.margin
23
- x = sheet.rtl ? (sheet_width - sheet.margin - sheet.gap - @width) : sheet.margin
23
+ x = sheet.rtl ? rtl_start_x(sheet_width, sheet, w) : sheet.margin
24
24
  cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height))
25
25
  end
26
- surface = trim(@cards[i].cairo_surface, sheet.trim, @width, @height)
26
+ surface = preprocess(@cards[i].cairo_surface,
27
+ sheet.trim, w, h,
28
+ rotate, batch.angle[i])
27
29
  cc.set_source(surface, x, y)
28
30
  cc.paint
29
31
  num_this_sheet += 1
30
- x += (surface.width + sheet.gap) * (sheet.rtl ? -1 : 1)
32
+ x += (w + sheet.gap) * (sheet.rtl ? -1 : 1)
31
33
  if num_this_sheet % sheet.columns == 0 # new row
32
- x = sheet.rtl ? (sheet_width - sheet.margin - sheet.gap - @width) : sheet.margin
33
- y += surface.height + sheet.gap
34
+ x = sheet.rtl ? rtl_start_x(sheet_width, sheet, w) : sheet.margin
35
+ y += h + sheet.gap
34
36
  end
35
37
  bar.increment
36
38
  end
@@ -38,18 +40,32 @@ module Squib
38
40
  end
39
41
  end
40
42
 
41
- # Return a new Cairo::ImageSurface that is trimmed from the original
42
- #
43
- # @param surface The surface to trim
44
- # @param trim The number of pixels around the edge to trim
45
- # @param width The width of the surface prior to the trim
46
- # @param height The height of the surface prior to the trim
43
+ def compute_dimensions(sheet, rotate)
44
+ w,h = rotate ? [@height,@width] : [@width,@height]
45
+ w -= 2 * sheet.trim
46
+ h -= 2 * sheet.trim
47
+ sheet_width = (sheet.columns * (w + 2 * sheet.gap)) + (2 * sheet.margin)
48
+ sheet_height = (sheet.rows * (h + 2 * sheet.gap)) + (2 * sheet.margin)
49
+ return [w, h, sheet_width, sheet_height]
50
+ end
51
+
52
+ def rtl_start_x(sheet_width, sheet, w)
53
+ return sheet_width - sheet.margin - sheet.gap - w
54
+ end
55
+
56
+ # Return a new Cairo::ImageSurface that is trimmed and rotated
57
+ # from the original
47
58
  # :nodoc:
48
59
  # @api private
49
- def trim(surface, trim, width, height)
50
- if trim > 0
51
- tmp = Cairo::ImageSurface.new(width - 2 * trim, height - 2 * trim)
60
+ def preprocess(surface, trim, w, h, rotate, angle)
61
+ if trim > 0 || rotate
62
+ tmp = Cairo::ImageSurface.new(w, h)
52
63
  cc = Cairo::Context.new(tmp)
64
+ if rotate
65
+ cc.translate w * 0.5, h * 0.5
66
+ cc.rotate angle
67
+ cc.translate h * -0.5, w * -0.5
68
+ end
53
69
  cc.set_source(surface, -1 * trim, -1 * trim)
54
70
  cc.paint
55
71
  surface = tmp
@@ -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,4 +1,4 @@
1
- require 'roo'
1
+ autoload :Roo, 'roo'
2
2
  require_relative 'quantity_exploder'
3
3
 
4
4
  module Squib::Import
@@ -10,13 +10,13 @@ module Squib::Import
10
10
  data = Squib::DataFrame.new
11
11
  s.first_column.upto(s.last_column) do |col|
12
12
  header = s.cell(s.first_row, col).to_s
13
- header.strip! if import.strip?
13
+ header = header.strip if import.strip?
14
14
  data[header] = []
15
15
  (s.first_row + 1).upto(s.last_row) do |row|
16
16
  cell = s.cell(row, col)
17
17
  # Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139)
18
18
  cell = s.excelx_value(row, col) if s.excelx_type(row, col) == [:numeric_or_formula, 'General']
19
- cell.strip! if cell.respond_to?(:strip) && import.strip?
19
+ cell = cell.strip if cell.respond_to?(:strip) && import.strip?
20
20
  cell = block.yield(header, cell) unless block.nil?
21
21
  data[header] << cell
22
22
  end# row
@@ -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,6 +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'
9
+ VERSION = '0.18.0'
10
10
  end
11
11
 
data/lib/squib.rb CHANGED
@@ -1,12 +1,13 @@
1
+ autoload :Cairo, 'cairo'
2
+ autoload :Pango, 'pango'
3
+ autoload :Rsvg, 'rsvg2'
1
4
  require 'logger'
2
- require 'cairo'
3
- require 'pango'
4
- require 'rsvg2'
5
5
  require 'rainbow/refinement'
6
6
  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'
10
11
 
11
12
  module Squib
12
13
  using Rainbow # we can colorize strings now!
@@ -0,0 +1,49 @@
1
+ # require 'squib'
2
+ require_relative '../../lib/squib'
3
+
4
+ # By default Squib will simply warn you if an image is missing
5
+ # Instead, you can give it a `placeholder`
6
+ Squib.configure img_missing: :silent # no warnings, no errors, no placeholder
7
+ # Squib.configure img_missing: :warn # default
8
+ # Squib.configure img_missing: :error # pre Squib v0.18 behavior... blech
9
+
10
+ Squib::Deck.new(width: 100, height: 100, cards: 3) do
11
+ background color: :white
12
+
13
+ files = %w(angler-fish.png does-not-exist.png) # last one is nil
14
+ png file: files, placeholder: 'grit.png'
15
+ save_sheet columns: 1, prefix: 'placeholder_sheet_'
16
+ end
17
+
18
+ # Placeholders can be per-image too.
19
+ # What if a placeholder is specified but doesn't exist? It'll always warn.
20
+ Squib.configure img_missing: :warn # default
21
+ Squib::Deck.new(width: 100, height: 100, cards: 4) do
22
+ background color: :white
23
+
24
+ files = %w(angler-fish.png does-not-exist.png does-not-exist.png does-not-exist.png)
25
+ placeholders = %w(grit.png does-not-exist.png grit.png )
26
+ png file: files, placeholder: placeholders
27
+
28
+ # text embeds can have placeholders too
29
+ text(str: 'A', color: :red) do |embed|
30
+ embed.png key: 'A', file: files, placeholder: placeholders, width: 30, height: 30
31
+ end
32
+
33
+ save_sheet columns: 1, prefix: 'multi_placeholder_sheet_'
34
+ end
35
+
36
+ # Do errors work?
37
+ # If you REALLY want the old, pre-Squib v0.18 functionality
38
+ # ...you can still have it
39
+ # This is really more of a regression test than example.
40
+ Squib.configure img_missing: :error
41
+ Squib::Deck.new(width: 100, height: 100, cards: 1) do
42
+ begin
43
+ png file: 'does-not-exist.png' # no placeholder... should error!
44
+ raise Exception.new 'Runtime Error should have been thrown!'
45
+ rescue RuntimeError => e
46
+ # a runtime error should have happened here. So nothing happens. Good.
47
+ Squib.logger.error 'Yay! An error we expected was thrown.'
48
+ end
49
+ end
@@ -1,7 +1,7 @@
1
- require 'squib'
1
+ # require 'squib'
2
+ require_relative '../../lib/squib'
2
3
 
3
4
  # This sample demonstrates how to use the various save methods
4
-
5
5
  Squib::Deck.new(width: 825, height: 1125, cards: 16) do
6
6
  background color: :gray
7
7
  rect x: 38, y: 38, width: 750, height: 1050,
@@ -50,3 +50,26 @@ 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
63
+
64
+ # Allow rotating
65
+ Squib::Deck.new(width: 100, height: 50, cards: 8) do
66
+ background color: :white
67
+ rect x: 10, y: 10, width: 80, height: 30
68
+ rect x: 5, y: 5, width: 90, height: 40, stroke_width: 5, stroke_color: :blue
69
+ text y: 2, str: 0..7, font: 'Open Sans Bold 8', align: :center, width: 100
70
+ save_sheet prefix: 'save_sheet_unrotated_', rows: 2, columns: 3
71
+ save_sheet prefix: 'save_sheet_custom_rotate_', rows: 2, columns: 3, rotate: [:clockwise, :counterclockwise] * 4
72
+ save_sheet prefix: 'save_sheet_rotated_', rows: 2, columns: 3, rotate: true
73
+ save_sheet prefix: 'save_sheet_rotated_trimmed_', rows: 2, columns: 3, rotate: true, trim: 5
74
+ save_sheet prefix: 'save_sheet_rotated_trimmed_rtl_', rows: 2, columns: 3, rotate: true, trim: 5, rtl: true
75
+ 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
data/squib.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.specification_version = 2 if spec.respond_to? :specification_version=
8
8
  spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
9
9
  spec.rubygems_version = '2.2.2'
10
- spec.required_ruby_version = '>= 2.5.0'
10
+ spec.required_ruby_version = '>= 2.7.0'
11
11
 
12
12
  spec.name = 'squib'
13
13
  spec.version = Squib::VERSION
@@ -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
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Meneely
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-25 00:00:00.000000000 Z
11
+ date: 2021-10-26 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
@@ -341,6 +341,7 @@ extra_rdoc_files:
341
341
  - samples/images/_cairo_access.rb
342
342
  - samples/images/_images.rb
343
343
  - samples/images/_more_load_images.rb
344
+ - samples/images/_placeholders.rb
344
345
  - samples/intro/01_hello.rb
345
346
  - samples/intro/02_options.rb
346
347
  - samples/intro/03_layout.rb
@@ -354,10 +355,11 @@ extra_rdoc_files:
354
355
  - samples/ranges/_ranges.rb
355
356
  - samples/saves/_hand.rb
356
357
  - samples/saves/_portrait_landscape.rb
357
- - samples/saves/_saves.rb
358
358
  - samples/saves/_save_filenames.rb
359
359
  - samples/saves/_save_pdf.rb
360
+ - samples/saves/_saves.rb
360
361
  - samples/saves/_showcase.rb
362
+ - samples/shadows/_shadow.rb
361
363
  - samples/shapes/_draw_shapes.rb
362
364
  - samples/shapes/_proofs.rb
363
365
  - samples/sprues/_advanced_sprues.rb
@@ -365,17 +367,25 @@ extra_rdoc_files:
365
367
  - samples/sprues/_fold_sheet.rb
366
368
  - samples/sprues/_hex_tiles.rb
367
369
  - samples/sprues/_mints.rb
370
+ - samples/sprues/_negative_coords.rb
368
371
  - samples/sprues/_sprue_example.rb
369
- - samples/text/bug134.rb
372
+ - samples/system_font_debug/_list_fonts.rb
370
373
  - samples/text/_embed_text.rb
371
374
  - samples/text/_text.rb
372
375
  - samples/text/_text_options.rb
376
+ - samples/text/bug134.rb
373
377
  - samples/units/_cells.rb
374
378
  - samples/units/_shorthands.rb
375
379
  - samples/units/_units.rb
376
380
  files:
381
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
382
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
383
+ - ".github/ISSUE_TEMPLATE/help-wanted.md"
384
+ - ".github/ISSUE_TEMPLATE/release-todo.md"
385
+ - ".github/PULL_REQUEST_TEMPLATE.md"
377
386
  - ".github/workflows/tests.yml"
378
387
  - ".gitignore"
388
+ - ".vscode/settings.json"
379
389
  - CHANGELOG.md
380
390
  - CONTRIBUTING.md
381
391
  - Dockerfile
@@ -383,7 +393,6 @@ files:
383
393
  - Guardfile
384
394
  - LICENSE.txt
385
395
  - README.md
386
- - RELEASE TODO.md
387
396
  - Rakefile
388
397
  - bin/squib
389
398
  - lib/squib.rb
@@ -396,6 +405,7 @@ files:
396
405
  - lib/squib/args/csv_opts.rb
397
406
  - lib/squib/args/dir_validator.rb
398
407
  - lib/squib/args/draw.rb
408
+ - lib/squib/args/drop_shadow.rb
399
409
  - lib/squib/args/embed_adjust.rb
400
410
  - lib/squib/args/embed_key.rb
401
411
  - lib/squib/args/hand_special.rb
@@ -517,6 +527,7 @@ files:
517
527
  - lib/squib/sprues/invalid_sprue_definition.rb
518
528
  - lib/squib/sprues/sprue.rb
519
529
  - lib/squib/sprues/sprue_schema.rb
530
+ - lib/squib/system_fonts.rb
520
531
  - lib/squib/version.rb
521
532
  - samples/autoscale_font/_autoscale_font.rb
522
533
  - samples/backend/_backend.rb
@@ -534,6 +545,7 @@ files:
534
545
  - samples/images/_cairo_access.rb
535
546
  - samples/images/_images.rb
536
547
  - samples/images/_more_load_images.rb
548
+ - samples/images/_placeholders.rb
537
549
  - samples/intro/01_hello.rb
538
550
  - samples/intro/02_options.rb
539
551
  - samples/intro/03_layout.rb
@@ -551,6 +563,7 @@ files:
551
563
  - samples/saves/_save_pdf.rb
552
564
  - samples/saves/_saves.rb
553
565
  - samples/saves/_showcase.rb
566
+ - samples/shadows/_shadow.rb
554
567
  - samples/shapes/_draw_shapes.rb
555
568
  - samples/shapes/_proofs.rb
556
569
  - samples/sprues/_advanced_sprues.rb
@@ -558,7 +571,9 @@ files:
558
571
  - samples/sprues/_fold_sheet.rb
559
572
  - samples/sprues/_hex_tiles.rb
560
573
  - samples/sprues/_mints.rb
574
+ - samples/sprues/_negative_coords.rb
561
575
  - samples/sprues/_sprue_example.rb
576
+ - samples/system_font_debug/_list_fonts.rb
562
577
  - samples/text/_embed_text.rb
563
578
  - samples/text/_text.rb
564
579
  - samples/text/_text_options.rb
@@ -580,7 +595,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
580
595
  requirements:
581
596
  - - ">="
582
597
  - !ruby/object:Gem::Version
583
- version: 2.5.0
598
+ version: 2.7.0
584
599
  required_rubygems_version: !ruby/object:Gem::Requirement
585
600
  requirements:
586
601
  - - ">="
@@ -588,7 +603,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
588
603
  version: '0'
589
604
  requirements:
590
605
  - On Windows, you need the Ruby+DevKit. See https://rubyinstaller.org/downloads
591
- rubygems_version: 3.1.4
606
+ rubygems_version: 3.2.15
592
607
  signing_key:
593
608
  specification_version: 2
594
609
  summary: A Ruby DSL for prototyping card games
@@ -609,6 +624,7 @@ test_files:
609
624
  - samples/images/_cairo_access.rb
610
625
  - samples/images/_images.rb
611
626
  - samples/images/_more_load_images.rb
627
+ - samples/images/_placeholders.rb
612
628
  - samples/intro/01_hello.rb
613
629
  - samples/intro/02_options.rb
614
630
  - samples/intro/03_layout.rb
@@ -626,6 +642,7 @@ test_files:
626
642
  - samples/saves/_save_pdf.rb
627
643
  - samples/saves/_saves.rb
628
644
  - samples/saves/_showcase.rb
645
+ - samples/shadows/_shadow.rb
629
646
  - samples/shapes/_draw_shapes.rb
630
647
  - samples/shapes/_proofs.rb
631
648
  - samples/sprues/_advanced_sprues.rb
@@ -633,7 +650,9 @@ test_files:
633
650
  - samples/sprues/_fold_sheet.rb
634
651
  - samples/sprues/_hex_tiles.rb
635
652
  - samples/sprues/_mints.rb
653
+ - samples/sprues/_negative_coords.rb
636
654
  - samples/sprues/_sprue_example.rb
655
+ - samples/system_font_debug/_list_fonts.rb
637
656
  - samples/text/_embed_text.rb
638
657
  - samples/text/_text.rb
639
658
  - samples/text/_text_options.rb
data/RELEASE TODO.md DELETED
@@ -1,22 +0,0 @@
1
- Be sure to remember to do the following for releases. (Copy into a GitHub issue)
2
-
3
- - [ ] CHANGELOG is written for all new changes
4
- - [ ] README is updated
5
- - [ ] Samples are updated
6
- - [ ] Are all the dependencies up to date?
7
- - [ ] Check `sample_regression_spec.rb` regression tests are all enabled (i.e. `overwrite_sample` is commented out)
8
- - [ ] Bump version.rb
9
- - [ ] Bump docs/conf.py versions
10
- - [ ] Do a full rake locally
11
- - [ ] `rake sanity`, and check visually
12
- - [ ] Travis is passing on dev branch
13
- - [ ] Merge master branch
14
- - [ ] Merge release branch
15
- - [ ] Push master and release branches
16
- - [ ] Create GitHub release tag
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
- - [ ] Github milestone closed
20
- - [ ] Activate version on squib.readthedocs.org
21
- - [ ] Bump version.rb to the next alpha
22
- - [ ] Publish on BoardGameGeek thread