Module: Prawn::Graphics::Transformation
- Included in:
- Prawn::Graphics
- Defined in:
- lib/prawn/graphics/transformation.rb
Instance Method Summary collapse
-
#rotate(angle, options = {}, &block) ⇒ Object
Rotate the user space.
-
#scale(factor, options = {}, &block) ⇒ Object
Scale the user space.
-
#transformation_matrix(a, b, c, d, e, f) ⇒ Object
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.
-
#translate(x, y, &block) ⇒ Object
Translate the user space.
Instance Method Details
#rotate(angle, options = {}, &block) ⇒ Object
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
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/prawn/graphics/transformation.rb', line 42 def rotate(angle, ={}, &block) Prawn.(:origin, ) rad = degree_to_rad(angle) cos = Math.cos(rad) sin = Math.sin(rad) if [:origin].nil? transformation_matrix(cos, sin, -sin, cos, 0, 0, &block) else raise Prawn::Errors::BlockRequired unless block_given? x = [:origin][0] + bounds.absolute_left y = [: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) ⇒ Object
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
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/prawn/graphics/transformation.rb', line 114 def scale(factor, ={}, &block) Prawn.(:origin, ) if [:origin].nil? transformation_matrix(factor, 0, 0, factor, 0, 0, &block) else raise Prawn::Errors::BlockRequired unless block_given? x = [:origin][0] + bounds.absolute_left y = [: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(a, b, c, d, e, f) ⇒ Object
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
144 145 146 147 148 149 150 151 152 |
# File 'lib/prawn/graphics/transformation.rb', line 144 def transformation_matrix(a, b, c, d, e, f) values = [a, b, c, d, e, f].map { |x| "%.5f" % x }.join(" ") save_graphics_state if block_given? add_content "#{values} cm" if block_given? yield restore_graphics_state end end |
#translate(x, y, &block) ⇒ Object
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
82 83 84 |
# File 'lib/prawn/graphics/transformation.rb', line 82 def translate(x, y, &block) transformation_matrix(1, 0, 0, 1, x, y, &block) end |