You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.8 KiB
103 lines
3.8 KiB
module Squib |
|
class Deck |
|
|
|
# :nodoc: |
|
# @api private |
|
def render_pdf(range, sheet) |
|
file = "#{sheet.dir}/#{sheet.file}" |
|
cc = Cairo::Context.new(Cairo::PDFSurface.new(file, sheet.width * 72.0 / @dpi, sheet.height * 72.0 / @dpi)) |
|
cc.scale(72.0 / @dpi, 72.0 / @dpi) # for bug #62 |
|
x, y = sheet.margin, sheet.margin |
|
card_width = @width - 2 * sheet.trim |
|
card_height = @height - 2 * sheet.trim |
|
@progress_bar.start("Saving PDF to #{file}", range.size) do |bar| |
|
range.each do |i| |
|
card = @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) |
|
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 |
|
end |
|
|
|
# :nodoc: |
|
# @api private |
|
def render_sheet(range, batch, sheet) |
|
sheet_width = (sheet.columns * (@width + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin) |
|
sheet_height = (sheet.rows * (@height + 2 * sheet.gap - 2 * sheet.trim)) + (2 * sheet.margin) |
|
cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height)) |
|
num_this_sheet = 0 |
|
sheet_num = 0 |
|
x, y = sheet.margin, sheet.margin |
|
@progress_bar.start("Saving PNG sheet to #{batch.summary}", @cards.size + 1) do |bar| |
|
range.each do |i| |
|
if num_this_sheet >= (sheet.columns * sheet.rows) # new sheet |
|
filename = batch.full_filename(sheet_num) |
|
cc.target.write_to_png(filename) |
|
new_sheet = false |
|
num_this_sheet = 0 |
|
sheet_num += 1 |
|
x, y = sheet.margin, sheet.margin |
|
cc = Cairo::Context.new(Cairo::ImageSurface.new(sheet_width, sheet_height)) |
|
end |
|
surface = trim(@cards[i].cairo_surface, sheet.trim, @width, @height) |
|
cc.set_source(surface, x, y) |
|
cc.paint |
|
num_this_sheet += 1 |
|
x += surface.width + sheet.gap |
|
if num_this_sheet % sheet.columns == 0 # new row |
|
x = sheet.margin |
|
y += surface.height + sheet.gap |
|
end |
|
bar.increment |
|
end |
|
cc.target.write_to_png(batch.full_filename(sheet_num)) |
|
end |
|
end |
|
|
|
# Return a new Cairo::ImageSurface that is trimmed from the original |
|
# |
|
# @param surface The surface to trim |
|
# @param trim The number of pixels around the edge to trim |
|
# @param width The width of the surface prior to the trim |
|
# @param height The height of the surface prior to the trim |
|
# :nodoc: |
|
# @api private |
|
def trim(surface, trim, width, height) |
|
if trim > 0 |
|
tmp = Cairo::ImageSurface.new(width - 2 * trim, height - 2 * trim) |
|
cc = Cairo::Context.new(tmp) |
|
cc.set_source(surface, -1 * trim, -1 * trim) |
|
cc.paint |
|
surface = tmp |
|
end |
|
surface |
|
end |
|
|
|
end |
|
end
|
|
|