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, options = {}) ⇒ Object
Draws a horizontal line from
x1
tox2
at the currenty
position, or the position specified by the :at option. -
#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.
-
#stroke_bounds ⇒ Object
Draws and strokes a rectangle represented by the current bounding box.
-
#vertical_line(y1, y2, params) ⇒ Object
Draws a vertical line at the x cooordinate given by :at 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
162 163 164 165 |
# File 'lib/prawn/graphics.rb', line 162 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]]
146 147 148 149 |
# File 'lib/prawn/graphics.rb', line 146 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
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/prawn/graphics.rb', line 175 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
228 229 230 231 |
# File 'lib/prawn/graphics.rb', line 228 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
235 236 237 238 |
# File 'lib/prawn/graphics.rb', line 235 def fill_and_stroke yield if block_given? add_content "b" end |
#horizontal_line(x1, x2, options = {}) ⇒ Object
Draws a horizontal line from x1
to x2
at the current y
position, or the position specified by the :at option.
# draw a line from [25, 75] to [100, 75]
horizontal_line 25, 100, :at => 75
115 116 117 118 119 120 121 122 123 |
# File 'lib/prawn/graphics.rb', line 115 def horizontal_line(x1,x2,={}) if [:at] y1 = [:at] else y1 = y - bounds.absolute_bottom end line(x1,y1,x2,y1) 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.
128 129 130 |
# File 'lib/prawn/graphics.rb', line 128 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]
206 207 208 209 210 211 |
# File 'lib/prawn/graphics.rb', line 206 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
215 216 217 218 |
# File 'lib/prawn/graphics.rb', line 215 def stroke yield if block_given? add_content "S" end |
#stroke_bounds ⇒ Object
Draws and strokes a rectangle represented by the current bounding box
222 223 224 |
# File 'lib/prawn/graphics.rb', line 222 def stroke_bounds stroke_rectangle bounds.top_left, bounds.width, bounds.height end |
#vertical_line(y1, y2, params) ⇒ Object
Draws a vertical line at the x cooordinate given by :at from y1 to y2.
# draw a line from [25, 100] to [25, 300]
vertical_line 100, 300, :at => 25
137 138 139 |
# File 'lib/prawn/graphics.rb', line 137 def vertical_line(y1,y2,params) line(params[:at],y1,params[:at],y2) end |