Browse Source

Flip options for sprues (#251) (#277)

* Flipping works, now just need new argument

* Finishing up

* New test data
dev
Andy Meneely 7 years ago committed by GitHub
parent
commit
cb66d7c31d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 2
      docs/args/transform.rst
  3. 10
      docs/sprues.rst
  4. 4
      lib/squib/graphics/cairo_context_wrapper.rb
  5. 10
      lib/squib/graphics/save_sprue.rb
  6. 3
      lib/squib/sprues/sprue.rb
  7. 6
      lib/squib/sprues/sprue_schema.rb
  8. 4
      samples/spanner.svg
  9. 7
      samples/sprues/_advanced_sprues.rb
  10. BIN
      samples/sprues/advanced_sprues_01_expected.png
  11. 8
      samples/sprues/my_sprues/weird_sprue.yml
  12. 13
      spec/data/sprues/card_flip.yml
  13. 9
      spec/sprue_spec.rb

1
CHANGELOG.md

@ -5,6 +5,7 @@ Squib follows [semantic versioning](http://semver.org).
Features:
* Added check for malformed PNG files (#250, #218)
* Sprues: you can now flip individual cards (#251)
Bugs
* `trim_radius` now defaults to 0 on `save_pdf`, not 38. (#270)

2
docs/args/transform.rst

@ -48,4 +48,4 @@ flip_horiztonal
flip_vertical
default: ``false``
Flip this image about its center verticall (i.e. top becomes bottom and vice versa).
Flip this image about its center vertical (i.e. top becomes bottom and vice versa).

10
docs/sprues.rst

@ -156,6 +156,16 @@ rotate
Rotate the card around its position_reference. Allows ``clockwise``, ``counterclockwise``, or ``turnaround``, or numerical angle.
flip_vertical
Default: ``false``
Determine whether or not to flip the card vertically about the vertical line through the card's its position reference. Works most intuitively with ``position_reference: :center``
flip_horizontal
Default: ``false``
Determine whether or not to flip the card vertically about the horizontal line through the card's its position reference. Works most intuitively with ``position_reference: :center``
crop_line
^^^^^^^^^

4
lib/squib/graphics/cairo_context_wrapper.rb

@ -20,11 +20,11 @@ module Squib
def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
:translate, :rotate, :move_to, :update_pango_layout, :width, :height,
:show_pango_layout, :rounded_rectangle, :set_line_width, :stroke, :fill,
:show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width, :stroke, :fill,
:set_source, :scale, :render_rsvg_handle, :circle, :triangle, :line_to,
:operator=, :show_page, :clip, :transform, :mask, :create_pango_layout,
:antialias=, :curve_to, :matrix, :matrix=, :identity_matrix, :pango_layout_path,
:stroke_preserve, :target, :new_path, :fill_preserve, :close_path,
:stroke_preserve, :target, :new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
:set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative
# :nodoc:

10
lib/squib/graphics/save_sprue.rb

@ -32,6 +32,7 @@ module Squib
draw_card cc, card,
slot['x'], slot['y'],
slot['rotate'],
slot['flip_vertical'], slot['flip_horizontal'],
@sheet_args.trim, @sheet_args.trim_radius
bar.increment
@ -128,7 +129,7 @@ module Squib
(@deck.height - 2.0 * @sheet_args.trim) > @tmpl.card_height
end
def draw_card(cc, card, x, y, angle, trim, trim_radius)
def draw_card(cc, card, x, y, angle, flip_v, flip_h, trim, trim_radius)
# Compute the true size of the card after trimming
w = @deck.width - 2.0 * trim
h = @deck.height - 2.0 * trim
@ -142,6 +143,7 @@ module Squib
mat = cc.matrix # Save the transformation matrix to revert later
cc.translate x, y
cc.translate @deck.width / 2.0, @deck.height / 2.0
cc.flip(flip_v, flip_h, 0, 0)
cc.rotate angle
cc.translate -@deck.width / 2.0, -@deck.height / 2.0
cc.rounded_rectangle(trim, trim, w, h, trim_radius, trim_radius) # clip
@ -164,7 +166,8 @@ module Squib
@tmpl.sheet_height * ratio
)
cc = Cairo::Context.new(surface)
cc = CairoContextWrapper.new(Cairo::Context.new(surface))
# cc = Cairo::Context.new(surface)
cc.scale(72.0 / @deck.dpi, 72.0 / @deck.dpi) # make it like pixels
cc
end
@ -185,7 +188,8 @@ module Squib
class SaveSpruePNG < SaveSprue
def init_cc
surface = Cairo::ImageSurface.new @tmpl.sheet_width, @tmpl.sheet_height
Cairo::Context.new(surface)
CairoContextWrapper.new(Cairo::Context.new(surface))
# Cairo::Context.new(surface)
end
def draw_page(cc)

3
lib/squib/sprues/sprue.rb

@ -175,6 +175,8 @@ module Squib
new_card['y'] = y
new_card['rotate'] = parse_rotate_param(
card['rotate'] ? card['rotate'] : @template_hash['rotate'])
new_card['flip_vertical'] = card['flip_vertical'] == true
new_card['flip_horizontal'] = card['flip_horizontal'] == true
new_card
end
@ -199,5 +201,6 @@ module Squib
val.to_f
end
end
end
end

6
lib/squib/sprues/sprue_schema.rb

@ -41,8 +41,10 @@ module Squib
:optional, Numeric,
ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround),
ROTATE_REGEX
]
}]]
],
'flip_vertical' => [ :optional, FalseClass ],
'flip_horizontal' => [ :optional, FalseClass ],
}]]
}.freeze
end
end

4
samples/spanner.svg

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

7
samples/sprues/_advanced_sprues.rb

@ -1,4 +1,5 @@
require 'squib'
# require 'squib'
require_relative '../../lib/squib'
# This is a more advanced example of Sprues
# (mostly so we can have a torturous regression test)
@ -14,10 +15,10 @@ Squib::Deck.new(cards: 6, width: '2.2in', height: '2.1in') do
circle x: width/2, y: height/2, radius: 20 # midpoint
text str: (0..9).map{ |i| "Card #{i}\n\n" },
text str: (0..9).map{ |i| "Card! #{i}\n\n" },
font: 'Sans 32', align: :center, valign: :middle,
height: :deck, width: :deck
save_sheet sprue: 'my_sprues/weird_sprue.yml',
trim: '0.2in', trim_radius: '10pt',
prefix: "advanced_sprues_"

BIN
samples/sprues/advanced_sprues_01_expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 109 KiB

8
samples/sprues/my_sprues/weird_sprue.yml

@ -1,6 +1,6 @@
---
sheet_width: 5in
sheet_height: 4.5in
sheet_height: 6.5in
card_width: 2in
card_height: 2in
position_reference: :center
@ -12,6 +12,10 @@ cards:
rotate: 3.14159
- x: 1.1in
y: 3.1in
flip_horizontal: true
- x: 3.1in
y: 3.1in
rotate: 2 # 2 radians?? ew.
rotate: 2 # 2 radians?? ew. (this exists to annoy anyone who digs this deep)
- x: 1.1in
y: 5.1in
flip_vertical: true

13
spec/data/sprues/card_flip.yml

@ -0,0 +1,13 @@
sheet_width: 8.5in
sheet_height: 11in
card_width: 2.5in
card_height: 3.5in
cards:
- x: 0.5in
y: 1in
- x: 3.0in
y: 1in
flip_vertical: true
- x: 3.5in
y: 1in
flip_horizontal: true

9
spec/sprue_spec.rb

@ -144,6 +144,15 @@ describe Squib::Sprue do
)
end
it 'loads a template with flipped cards' do
tmpl = Squib::Sprue.load(sprue_file('card_flip.yml'), 100)
expect(tmpl.cards.length).to eq(3)
expect(tmpl.cards.map { |card| card['flip_vertical'] })
.to eq( [false, true, false] )
expect(tmpl.cards.map { |card| card['flip_horizontal'] })
.to eq( [false, false, true] )
end
it 'fails when sheet_width is not defined' do
expect do
Squib::Sprue.load(sprue_file('fail_no_sheet_width.yml'), 100)

Loading…
Cancel
Save