Module: Prawn::Graphics
- Includes:
- Color
- Included in:
- Document
- Defined in:
- lib/prawn/graphics.rb,
lib/prawn/graphics/cell.rb,
lib/prawn/graphics/color.rb
Overview
Implements the drawing facilities for Prawn::Document.
Use this to draw the most beautiful imaginable things.
This file lifts and modifies several of PDF::Writer’s graphics functions ruby-pdf.rubyforge.org
Defined Under Namespace
Modules: Color Classes: Cell, CellBlock
Constant Summary collapse
- KAPPA =
This constant is used to approximate a symmetrical arc using a cubic Bezier curve.
4.0 * ((Math.sqrt(2) - 1.0) / 3.0)
Instance Method Summary collapse
-
#circle_at(point, options) ⇒ Object
Draws a circle of radius
:radius
with the centre-point atpoint
as a complete subpath. -
#curve(origin, dest, options = {}) ⇒ Object
Draws a Bezier curve between two points, bounded by two additional points.
-
#curve_to(dest, options = {}) ⇒ Object
Draws a Bezier curve from the current drawing position to the specified point, bounded by two additional points.
-
#ellipse_at(point, r1, r2 = r1) ⇒ Object
Draws an ellipse of
x
radiusr1
andy
radiusr2
with the centre-point atpoint
as a complete subpath. -
#fill ⇒ Object
Fills and closes the current path.
-
#fill_and_stroke ⇒ Object
Fills, strokes, and closes the current path.
-
#horizontal_line(x1, x2) ⇒ Object
Draws a horizontal line from
x1
tox2
at the currenty
position. -
#horizontal_rule ⇒ Object
Draws a horizontal line from the left border to the right border of the bounding box at the current
y
position. -
#line(*points) ⇒ Object
Draws a line from one point to another.
-
#line_to(*point) ⇒ Object
Draws a line from the current drawing position to the specified point.
-
#line_width(width = nil) ⇒ Object
The current line thickness.
-
#line_width=(width) ⇒ Object
Sets line thickness to the
width
specified. -
#move_to(*point) ⇒ Object
Moves the drawing position to a given point.
-
#polygon(*points) ⇒ Object
Draws a polygon from the specified points.
-
#rectangle(point, width, height) ⇒ Object
Draws a rectangle given
point
,width
andheight
. -
#stroke ⇒ Object
Strokes and closes the current path.
-
#vertical_line_at(x, y1, y2) ⇒ Object
Draws a vertical line at the given x position from y1 to y2.
Methods included from Color
#fill_color, hex2rgb, #method_missing, rgb2hex, #stroke_color
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Prawn::Graphics::Color
Instance Method Details
#circle_at(point, options) ⇒ Object
Draws a circle of radius :radius
with the centre-point at point
as a complete subpath. The drawing point will be moved to the centre-point upon completion of the drawing the circle.
pdf.circle_at [100,100], :radius => 25
150 151 152 153 |
# File 'lib/prawn/graphics.rb', line 150 def circle_at(point, ) x,y = point ellipse_at [x, y], [:radius] end |
#curve(origin, dest, options = {}) ⇒ Object
Draws a Bezier curve between two points, bounded by two additional points
pdf.curve [50,100], [100,100], :bounds => [[90,90],[75,75]]
134 135 136 137 |
# File 'lib/prawn/graphics.rb', line 134 def curve(origin,dest, ={}) move_to *origin curve_to(dest,) end |
#curve_to(dest, options = {}) ⇒ Object
Draws a Bezier curve from the current drawing position to the specified point, bounded by two additional points.
pdf.curve_to [100,100], :bounds => [[90,90],[75,75]]
56 57 58 59 60 61 62 63 64 |
# File 'lib/prawn/graphics.rb', line 56 def curve_to(dest,={}) [:bounds] or raise Prawn::Errors::InvalidGraphicsPath, "Bounding points for bezier curve must be specified "+ "as :bounds => [[x1,y1],[x2,y2]]" curve_points = ([:bounds] << dest).map { |e| translate(e) } add_content("%.3f %.3f %.3f %.3f %.3f %.3f c" % curve_points.flatten ) end |
#ellipse_at(point, r1, r2 = r1) ⇒ Object
Draws an ellipse of x
radius r1
and y
radius r2
with the centre-point at point
as a complete subpath. The drawing point will be moved to the centre-point upon completion of the drawing the ellipse.
# draws an ellipse with x-radius 25 and y-radius 50
pdf.ellipse_at [100,100], 25, 50
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/prawn/graphics.rb', line 163 def ellipse_at(point, r1, r2 = r1) x, y = point l1 = r1 * KAPPA l2 = r2 * KAPPA move_to(x + r1, y) # Upper right hand corner curve_to [x, y + r2], :bounds => [[x + r1, y + l1], [x + l2, y + r2]] # Upper left hand corner curve_to [x - r1, y], :bounds => [[x - l2, y + r2], [x - r1, y + l1]] # Lower left hand corner curve_to [x, y - r2], :bounds => [[x - r1, y - l1], [x - l2, y - r2]] # Lower right hand corner curve_to [x + r1, y], :bounds => [[x + l2, y - r2], [x + r1, y - l1]] move_to(x, y) end |
#fill ⇒ Object
Fills and closes the current path. See Graphic::Color for color details
210 211 212 213 |
# File 'lib/prawn/graphics.rb', line 210 def fill yield if block_given? add_content "f" end |
#fill_and_stroke ⇒ Object
Fills, strokes, and closes the current path. See Graphic::Color for color details
217 218 219 220 |
# File 'lib/prawn/graphics.rb', line 217 def fill_and_stroke yield if block_given? add_content "b" end |
#horizontal_line(x1, x2) ⇒ Object
Draws a horizontal line from x1
to x2
at the current y
position.
112 113 114 |
# File 'lib/prawn/graphics.rb', line 112 def horizontal_line(x1,x2) line(x1,y-bounds.absolute_bottom,x2,y-bounds.absolute_bottom) end |
#horizontal_rule ⇒ Object
Draws a horizontal line from the left border to the right border of the bounding box at the current y
position.
119 120 121 |
# File 'lib/prawn/graphics.rb', line 119 def horizontal_rule horizontal_line(bounds.left, bounds.right) end |
#line(*points) ⇒ Object
Draws a line from one point to another. Points may be specified as tuples or flattened argument list:
pdf.line [100,100], [200,250]
pdf.line(100,100,200,250)
103 104 105 106 107 |
# File 'lib/prawn/graphics.rb', line 103 def line(*points) x0,y0,x1,y1 = points.flatten move_to(x0, y0) line_to(x1, y1) end |
#line_to(*point) ⇒ Object
Draws a line from the current drawing position to the specified point. The destination may be described as a tuple or a flattened list:
pdf.line_to [50,50]
pdf.line_to(50,50)
46 47 48 49 |
# File 'lib/prawn/graphics.rb', line 46 def line_to(*point) x,y = translate(point) add_content("%.3f %.3f l" % [ x, y ]) end |
#line_width(width = nil) ⇒ Object
The current line thickness
89 90 91 92 93 94 95 |
# File 'lib/prawn/graphics.rb', line 89 def line_width(width=nil) if width self.line_width = width else @line_width || 1 end end |
#line_width=(width) ⇒ Object
Sets line thickness to the width
specified.
82 83 84 85 |
# File 'lib/prawn/graphics.rb', line 82 def line_width=(width) @line_width = width add_content("#{width} w") end |
#move_to(*point) ⇒ Object
Moves the drawing position to a given point. The point can be specified as a tuple or a flattened argument list
pdf.move_to [100,50]
pdf.move_to(100,50)
35 36 37 38 |
# File 'lib/prawn/graphics.rb', line 35 def move_to(*point) x,y = translate(point) add_content("%.3f %.3f m" % [ x, y ]) end |
#polygon(*points) ⇒ Object
Draws a polygon from the specified points.
# draws a snazzy triangle
pdf.polygon [100,100], [100,200], [200,200]
194 195 196 197 198 199 |
# File 'lib/prawn/graphics.rb', line 194 def polygon(*points) move_to points[0] (points << points[0]).each_cons(2) do |p1,p2| line_to(*p2) end end |
#rectangle(point, width, height) ⇒ Object
Draws a rectangle given point
, width
and height
. The rectangle is bounded by its upper-left corner.
pdf.rectangle [300,300], 100, 200
71 72 73 74 |
# File 'lib/prawn/graphics.rb', line 71 def rectangle(point,width,height) x,y = translate(point) add_content("%.3f %.3f %.3f %.3f re" % [ x, y - height, width, height ]) end |
#stroke ⇒ Object
Strokes and closes the current path. See Graphic::Color for color details
203 204 205 206 |
# File 'lib/prawn/graphics.rb', line 203 def stroke yield if block_given? add_content "S" end |
#vertical_line_at(x, y1, y2) ⇒ Object
Draws a vertical line at the given x position from y1 to y2.
125 126 127 |
# File 'lib/prawn/graphics.rb', line 125 def vertical_line_at(x,y1,y2) line(x,y1,x,y2) end |