module Prawn::Graphics::Transformation

Public Instance Methods

rotate(angle, options = {}, &block) click to toggle source

Rotate the user space. If a block is not provided, then you must save and restore the graphics state yourself.

Options

:origin

[number, number]. The point around which to rotate. A block must be provided if using the :origin

raises Prawn::Errors::BlockRequired if an :origin option is provided, but no block is given

Example without a block:

save_graphics_state
rotate 30
text "rotated text"
restore_graphics_state

Example with a block: rotating a rectangle around its upper-left corner

x = 300
y = 300
width = 150
height = 200
angle = 30
pdf.rotate(angle, :origin => [x, y]) do
  pdf.stroke_rectangle([x, y], width, height)
end
# File lib/prawn/graphics/transformation.rb, line 41
def rotate(angle, options = {}, &block)
  Prawn.verify_options(:origin, options)
  rad = degree_to_rad(angle)
  cos = Math.cos(rad)
  sin = Math.sin(rad)
  if options[:origin].nil?
    transformation_matrix(cos, sin, -sin, cos, 0, 0, &block)
  else
    raise Prawn::Errors::BlockRequired unless block_given?
    x = options[:origin][0] + bounds.absolute_left
    y = options[:origin][1] + bounds.absolute_bottom
    x_prime = x * cos - y * sin
    y_prime = x * sin + y * cos
    translate(x - x_prime, y - y_prime) do
      transformation_matrix(cos, sin, -sin, cos, 0, 0, &block)
    end
  end
end
scale(factor, options = {}, &block) click to toggle source

Scale the user space. If a block is not provided, then you must save and restore the graphics state yourself.

Options

:origin

[number, number]. The point from which to scale. A block must be provided if using the :origin

raises Prawn::Errors::BlockRequired if an :origin option is provided, but no block is given

Example without a block:

save_graphics_state
scale 1.5
text "scaled text"
restore_graphics_state

Example with a block: scale a rectangle from its upper-left corner

x = 300
y = 300
width = 150
height = 200
factor = 1.5
pdf.scale(angle, :origin => [x, y]) do
  pdf.stroke_rectangle([x, y], width, height)
end
# File lib/prawn/graphics/transformation.rb, line 113
def scale(factor, options = {}, &block)
  Prawn.verify_options(:origin, options)
  if options[:origin].nil?
    transformation_matrix(factor, 0, 0, factor, 0, 0, &block)
  else
    raise Prawn::Errors::BlockRequired unless block_given?
    x = options[:origin][0] + bounds.absolute_left
    y = options[:origin][1] + bounds.absolute_bottom
    x_prime = factor * x
    y_prime = factor * y
    translate(x - x_prime, y - y_prime) do
      transformation_matrix(factor, 0, 0, factor, 0, 0, &block)
    end
  end
end
transformation_matrix(*matrix) { || ... } click to toggle source

Transform the user space (see notes for rotate regarding graphics state) Generally, one would use the rotate, scale, translate, and skew convenience methods instead of calling #transformation_matrix directly

# File lib/prawn/graphics/transformation.rb, line 143
def transformation_matrix(*matrix)
  if matrix.length != 6
    raise ArgumentError,
      'Transformation matrix must have exacty 6 elements'
  end
  values = matrix.map { |x| format '%.5f', x }.join(' ')
  save_graphics_state if block_given?

  add_to_transformation_stack(*matrix)

  renderer.add_content "#{values} cm"
  if block_given?
    yield
    restore_graphics_state
  end
end
translate(x, y, &block) click to toggle source

Translate the user space. If a block is not provided, then you must save and restore the graphics state yourself.

Example without a block: move the text up and over 10

save_graphics_state
translate(10, 10)
text "scaled text"
restore_graphics_state

Example with a block: draw a rectangle with its upper-left corner at

                    x + 10, y + 10

x = 300
y = 300
width = 150
height = 200
pdf.translate(10, 10) do
  pdf.stroke_rectangle([x, y], width, height)
end
# File lib/prawn/graphics/transformation.rb, line 81
def translate(x, y, &block)
  transformation_matrix(1, 0, 0, 1, x, y, &block)
end