Browse Source
Should satisfy #123 Needs some testing on printers but the functionality is there.dev
11 changed files with 1711 additions and 506 deletions
@ -0,0 +1,85 @@ |
|||||||
|
require_relative '../args/sheet' |
||||||
|
|
||||||
|
module Squib |
||||||
|
module Graphics |
||||||
|
class SavePDF |
||||||
|
|
||||||
|
def initialize(deck) |
||||||
|
@deck = deck |
||||||
|
end |
||||||
|
|
||||||
|
# :nodoc: |
||||||
|
# @api private |
||||||
|
def render_pdf(range, sheet) |
||||||
|
cc = init_cc(sheet) |
||||||
|
cc.scale(72.0 / @deck.dpi, 72.0 / @deck.dpi) # for bug #62 |
||||||
|
x, y = sheet.margin, sheet.margin |
||||||
|
card_width = @deck.width - 2 * sheet.trim |
||||||
|
card_height = @deck.height - 2 * sheet.trim |
||||||
|
track_progress(range, sheet) do |bar| |
||||||
|
range.each do |i| |
||||||
|
card = @deck.cards[i] |
||||||
|
cc.translate(x, y) |
||||||
|
cc.rectangle(sheet.trim, sheet.trim, card_width, card_height) |
||||||
|
cc.clip |
||||||
|
case card.backend.downcase.to_sym |
||||||
|
when :memory |
||||||
|
cc.set_source(card.cairo_surface, 0, 0) |
||||||
|
cc.paint |
||||||
|
when :svg |
||||||
|
card.cairo_surface.finish |
||||||
|
cc.save |
||||||
|
cc.scale(0.8, 0.8) # I really don't know why I needed to do this at all. But 0.8 is the magic number to get this to scale right |
||||||
|
cc.render_rsvg_handle(RSVG::Handle.new_from_file(card.svgfile), nil) |
||||||
|
cc.restore |
||||||
|
else |
||||||
|
abort "No such back end supported for save_pdf: #{backend}" |
||||||
|
end |
||||||
|
bar.increment |
||||||
|
cc.reset_clip |
||||||
|
cc.translate(-x, -y) |
||||||
|
draw_crop_marks(cc, x, y, sheet) if sheet.crop_marks |
||||||
|
x += card.width + sheet.gap - 2 * sheet.trim |
||||||
|
if x > (sheet.width - card_width - sheet.margin) |
||||||
|
x = sheet.margin |
||||||
|
y += card.height + sheet.gap - 2 * sheet.trim |
||||||
|
if y > (sheet.height - card_height - sheet.margin) |
||||||
|
cc.show_page # next page |
||||||
|
x, y = sheet.margin, sheet.margin |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
cc.target.finish |
||||||
|
end |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
# Initialize the Cairo Context |
||||||
|
def init_cc(sheet) |
||||||
|
Cairo::Context.new(Cairo::PDFSurface.new( |
||||||
|
"#{sheet.dir}/#{sheet.file}", |
||||||
|
sheet.width * 72.0 / @deck.dpi, #PDF thinks in 72 DPI "points" |
||||||
|
sheet.height * 72.0 / @deck.dpi) |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
def track_progress(range, sheet) |
||||||
|
msg = "Saving PDF to #{sheet.full_filename}" |
||||||
|
@deck.progress_bar.start(msg, range.size) { |bar| yield(bar) } |
||||||
|
end |
||||||
|
|
||||||
|
def draw_crop_marks(cc, x, y, sheet) |
||||||
|
sheet.crop_coords(x, y, @deck.width, @deck.height).each do |coord| |
||||||
|
cc.move_to(coord[:x1], coord[:y1]) |
||||||
|
cc.line_to(coord[:x2], coord[:y2]) |
||||||
|
cc.set_source_color(sheet.crop_stroke_color) |
||||||
|
cc.set_dash(sheet.crop_stroke_dash) |
||||||
|
cc.set_line_width(sheet.crop_stroke_width) |
||||||
|
cc.stroke |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
@ -1 +1 @@ |
|||||||
Subproject commit 2b3a6498fdf4668f5d7a30aa2773e4a0f1f1c4f2 |
Subproject commit 711ec5a0596a62f6b699a202b7f557d9cd5d20fe |
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue