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

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, options)  
  x,y = point
  ellipse_at [x, y], options[: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, options={})
  move_to *origin    
  curve_to(dest,options)
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,options={})                           
   options[:bounds] or raise Prawn::Errors::InvalidGraphicsPath, 
     "Bounding points for bezier curve must be specified "+
     "as :bounds => [[x1,y1],[x2,y2]]"       

   curve_points = (options[: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

#fillObject

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_strokeObject

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_ruleObject

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

#strokeObject

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