prawn 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +2 -2
  3. data/Gemfile +18 -0
  4. data/LICENSE +1 -1
  5. data/README.md +17 -4
  6. data/Rakefile +18 -22
  7. data/data/images/indexed_color.dat +0 -0
  8. data/data/images/indexed_color.png +0 -0
  9. data/data/pdfs/nested_pages.pdf +13 -13
  10. data/lib/pdf/core.rb +35 -0
  11. data/lib/{prawn → pdf}/core/annotations.rb +6 -7
  12. data/lib/{prawn → pdf}/core/byte_string.rb +1 -1
  13. data/lib/{prawn → pdf}/core/destinations.rb +23 -23
  14. data/lib/{prawn → pdf}/core/document_state.rb +8 -8
  15. data/lib/pdf/core/filter_list.rb +51 -0
  16. data/lib/pdf/core/filters.rb +36 -0
  17. data/lib/pdf/core/graphics_state.rb +68 -0
  18. data/lib/{prawn → pdf}/core/literal_string.rb +1 -1
  19. data/lib/{prawn → pdf}/core/name_tree.rb +14 -2
  20. data/lib/{prawn → pdf}/core/object_store.rb +80 -24
  21. data/lib/pdf/core/outline.rb +315 -0
  22. data/lib/{prawn → pdf}/core/page.rb +23 -26
  23. data/lib/{prawn/document → pdf/core}/page_geometry.rb +11 -21
  24. data/lib/{prawn → pdf}/core/pdf_object.rb +48 -32
  25. data/lib/{prawn → pdf}/core/reference.rb +35 -44
  26. data/lib/pdf/core/stream.rb +98 -0
  27. data/lib/{prawn → pdf}/core/text.rb +24 -17
  28. data/lib/prawn.rb +95 -17
  29. data/lib/prawn/compatibility.rb +66 -26
  30. data/lib/prawn/document.rb +48 -30
  31. data/lib/prawn/document/bounding_box.rb +3 -3
  32. data/lib/prawn/document/column_box.rb +46 -8
  33. data/lib/prawn/document/graphics_state.rb +10 -73
  34. data/lib/prawn/document/internals.rb +24 -23
  35. data/lib/prawn/document/snapshot.rb +6 -7
  36. data/lib/prawn/document/span.rb +10 -10
  37. data/lib/prawn/encoding.rb +7 -7
  38. data/lib/prawn/errors.rb +18 -29
  39. data/lib/prawn/font.rb +64 -28
  40. data/lib/prawn/font/afm.rb +32 -74
  41. data/lib/prawn/font/dfont.rb +2 -2
  42. data/lib/prawn/font/ttf.rb +28 -57
  43. data/lib/prawn/font_metric_cache.rb +45 -0
  44. data/lib/prawn/graphics.rb +307 -41
  45. data/lib/prawn/graphics/cap_style.rb +3 -3
  46. data/lib/prawn/graphics/color.rb +12 -5
  47. data/lib/prawn/graphics/dash.rb +52 -31
  48. data/lib/prawn/graphics/join_style.rb +7 -7
  49. data/lib/prawn/graphics/patterns.rb +137 -0
  50. data/lib/prawn/graphics/transformation.rb +9 -9
  51. data/lib/prawn/graphics/transparency.rb +1 -1
  52. data/lib/prawn/image_handler.rb +30 -0
  53. data/lib/prawn/images.rb +86 -105
  54. data/lib/prawn/images/image.rb +48 -0
  55. data/lib/prawn/images/jpg.rb +14 -10
  56. data/lib/prawn/images/png.rb +50 -37
  57. data/lib/prawn/layout.rb +2 -2
  58. data/lib/prawn/layout/grid.rb +51 -51
  59. data/lib/prawn/measurement_extensions.rb +5 -5
  60. data/lib/prawn/measurements.rb +25 -21
  61. data/lib/prawn/outline.rb +4 -308
  62. data/lib/prawn/repeater.rb +8 -8
  63. data/lib/prawn/security.rb +50 -36
  64. data/lib/prawn/soft_mask.rb +94 -0
  65. data/lib/prawn/stamp.rb +3 -3
  66. data/lib/prawn/table.rb +292 -118
  67. data/lib/prawn/table/cell.rb +272 -45
  68. data/lib/prawn/table/cell/image.rb +70 -0
  69. data/lib/prawn/table/cell/in_table.rb +2 -2
  70. data/lib/prawn/table/cell/span_dummy.rb +92 -0
  71. data/lib/prawn/table/cell/subtable.rb +2 -2
  72. data/lib/prawn/table/cell/text.rb +42 -24
  73. data/lib/prawn/table/cells.rb +137 -48
  74. data/lib/prawn/text.rb +35 -23
  75. data/lib/prawn/text/box.rb +18 -5
  76. data/lib/prawn/text/formatted.rb +5 -4
  77. data/lib/prawn/text/formatted/arranger.rb +292 -0
  78. data/lib/prawn/text/formatted/box.rb +52 -13
  79. data/lib/prawn/text/formatted/fragment.rb +37 -22
  80. data/lib/prawn/text/formatted/line_wrap.rb +286 -0
  81. data/lib/prawn/text/formatted/parser.rb +14 -6
  82. data/lib/prawn/text/formatted/wrap.rb +151 -0
  83. data/lib/prawn/utilities.rb +44 -0
  84. data/manual/basic_concepts/adding_pages.rb +27 -0
  85. data/manual/basic_concepts/basic_concepts.rb +34 -0
  86. data/manual/basic_concepts/creation.rb +39 -0
  87. data/manual/basic_concepts/cursor.rb +33 -0
  88. data/manual/basic_concepts/measurement.rb +25 -0
  89. data/manual/basic_concepts/origin.rb +38 -0
  90. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  91. data/manual/bounding_box/bounding_box.rb +39 -0
  92. data/manual/bounding_box/bounds.rb +49 -0
  93. data/manual/bounding_box/canvas.rb +24 -0
  94. data/manual/bounding_box/creation.rb +23 -0
  95. data/manual/bounding_box/indentation.rb +46 -0
  96. data/manual/bounding_box/nesting.rb +45 -0
  97. data/manual/bounding_box/russian_boxes.rb +40 -0
  98. data/manual/bounding_box/stretchy.rb +31 -0
  99. data/manual/document_and_page_options/background.rb +27 -0
  100. data/manual/document_and_page_options/document_and_page_options.rb +31 -0
  101. data/manual/document_and_page_options/metadata.rb +23 -0
  102. data/manual/document_and_page_options/page_margins.rb +38 -0
  103. data/manual/document_and_page_options/page_size.rb +34 -0
  104. data/manual/example_file.rb +116 -0
  105. data/manual/example_helper.rb +411 -0
  106. data/manual/example_package.rb +53 -0
  107. data/manual/example_section.rb +46 -0
  108. data/manual/graphics/circle_and_ellipse.rb +22 -0
  109. data/manual/graphics/color.rb +24 -0
  110. data/manual/graphics/common_lines.rb +28 -0
  111. data/manual/graphics/fill_and_stroke.rb +42 -0
  112. data/manual/graphics/fill_rules.rb +37 -0
  113. data/manual/graphics/gradients.rb +37 -0
  114. data/manual/graphics/graphics.rb +58 -0
  115. data/manual/graphics/helper.rb +24 -0
  116. data/manual/graphics/line_width.rb +35 -0
  117. data/manual/graphics/lines_and_curves.rb +41 -0
  118. data/manual/graphics/polygon.rb +29 -0
  119. data/manual/graphics/rectangle.rb +21 -0
  120. data/manual/graphics/rotate.rb +28 -0
  121. data/manual/graphics/scale.rb +41 -0
  122. data/manual/graphics/soft_masks.rb +46 -0
  123. data/manual/graphics/stroke_cap.rb +31 -0
  124. data/manual/graphics/stroke_dash.rb +48 -0
  125. data/manual/graphics/stroke_join.rb +30 -0
  126. data/manual/graphics/translate.rb +29 -0
  127. data/manual/graphics/transparency.rb +35 -0
  128. data/manual/images/absolute_position.rb +23 -0
  129. data/manual/images/fit.rb +21 -0
  130. data/manual/images/horizontal.rb +25 -0
  131. data/manual/images/images.rb +40 -0
  132. data/manual/images/plain_image.rb +18 -0
  133. data/manual/images/scale.rb +22 -0
  134. data/manual/images/vertical.rb +28 -0
  135. data/manual/images/width_and_height.rb +25 -0
  136. data/manual/layout/boxes.rb +27 -0
  137. data/manual/layout/content.rb +25 -0
  138. data/manual/layout/layout.rb +28 -0
  139. data/manual/layout/simple_grid.rb +23 -0
  140. data/manual/manual/cover.rb +35 -0
  141. data/manual/manual/foreword.rb +85 -0
  142. data/manual/manual/how_to_read_this_manual.rb +41 -0
  143. data/manual/manual/manual.rb +35 -0
  144. data/manual/outline/add_subsection_to.rb +61 -0
  145. data/manual/outline/insert_section_after.rb +47 -0
  146. data/manual/outline/outline.rb +32 -0
  147. data/manual/outline/sections_and_pages.rb +67 -0
  148. data/manual/repeatable_content/page_numbering.rb +54 -0
  149. data/manual/repeatable_content/repeatable_content.rb +31 -0
  150. data/manual/repeatable_content/repeater.rb +55 -0
  151. data/manual/repeatable_content/stamp.rb +41 -0
  152. data/manual/security/encryption.rb +31 -0
  153. data/manual/security/permissions.rb +38 -0
  154. data/manual/security/security.rb +28 -0
  155. data/manual/syntax_highlight.rb +52 -0
  156. data/manual/table/basic_block.rb +53 -0
  157. data/manual/table/before_rendering_page.rb +26 -0
  158. data/manual/table/cell_border_lines.rb +24 -0
  159. data/manual/table/cell_borders_and_bg.rb +31 -0
  160. data/manual/table/cell_dimensions.rb +30 -0
  161. data/manual/table/cell_text.rb +38 -0
  162. data/manual/table/column_widths.rb +30 -0
  163. data/manual/table/content_and_subtables.rb +39 -0
  164. data/manual/table/creation.rb +27 -0
  165. data/manual/table/filtering.rb +36 -0
  166. data/manual/table/flow_and_header.rb +17 -0
  167. data/manual/table/image_cells.rb +33 -0
  168. data/manual/table/position.rb +29 -0
  169. data/manual/table/row_colors.rb +20 -0
  170. data/manual/table/span.rb +30 -0
  171. data/manual/table/style.rb +22 -0
  172. data/manual/table/table.rb +52 -0
  173. data/manual/table/width.rb +27 -0
  174. data/manual/templates/full_template.rb +25 -0
  175. data/manual/templates/page_template.rb +48 -0
  176. data/manual/templates/templates.rb +27 -0
  177. data/manual/text/alignment.rb +44 -0
  178. data/manual/text/color.rb +24 -0
  179. data/manual/text/column_box.rb +32 -0
  180. data/manual/text/fallback_fonts.rb +37 -0
  181. data/manual/text/font.rb +41 -0
  182. data/manual/text/font_size.rb +45 -0
  183. data/manual/text/font_style.rb +23 -0
  184. data/manual/text/formatted_callbacks.rb +60 -0
  185. data/manual/text/formatted_text.rb +54 -0
  186. data/manual/text/free_flowing_text.rb +51 -0
  187. data/manual/text/group.rb +29 -0
  188. data/manual/text/inline.rb +43 -0
  189. data/manual/text/kerning_and_character_spacing.rb +39 -0
  190. data/manual/text/leading.rb +25 -0
  191. data/manual/text/line_wrapping.rb +41 -0
  192. data/manual/text/paragraph_indentation.rb +26 -0
  193. data/manual/text/positioned_text.rb +38 -0
  194. data/manual/text/registering_families.rb +48 -0
  195. data/manual/text/rendering_and_color.rb +37 -0
  196. data/manual/text/right_to_left_text.rb +43 -0
  197. data/manual/text/rotation.rb +43 -0
  198. data/manual/text/single_usage.rb +37 -0
  199. data/manual/text/text.rb +75 -0
  200. data/manual/text/text_box_excess.rb +32 -0
  201. data/manual/text/text_box_extensions.rb +45 -0
  202. data/manual/text/text_box_overflow.rb +44 -0
  203. data/manual/text/utf8.rb +28 -0
  204. data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
  205. data/prawn.gemspec +18 -12
  206. data/spec/acceptance/png.rb +23 -0
  207. data/spec/annotations_spec.rb +16 -32
  208. data/spec/bounding_box_spec.rb +128 -15
  209. data/spec/cell_spec.rb +169 -38
  210. data/spec/column_box_spec.rb +33 -0
  211. data/spec/destinations_spec.rb +5 -5
  212. data/spec/document_spec.rb +150 -104
  213. data/spec/extensions/encoding_helpers.rb +10 -0
  214. data/spec/extensions/mocha.rb +1 -0
  215. data/spec/filters_spec.rb +34 -0
  216. data/spec/font_metric_cache_spec.rb +52 -0
  217. data/spec/font_spec.rb +183 -97
  218. data/spec/formatted_text_arranger_spec.rb +43 -43
  219. data/spec/formatted_text_box_spec.rb +30 -20
  220. data/spec/formatted_text_fragment_spec.rb +8 -8
  221. data/spec/graphics_spec.rb +158 -69
  222. data/spec/grid_spec.rb +15 -15
  223. data/spec/image_handler_spec.rb +42 -0
  224. data/spec/images_spec.rb +49 -24
  225. data/spec/inline_formatted_text_parser_spec.rb +73 -19
  226. data/spec/jpg_spec.rb +4 -4
  227. data/spec/line_wrap_spec.rb +26 -26
  228. data/spec/measurement_units_spec.rb +6 -6
  229. data/spec/name_tree_spec.rb +21 -21
  230. data/spec/object_store_spec.rb +39 -39
  231. data/spec/outline_spec.rb +93 -53
  232. data/spec/pdf_object_spec.rb +88 -86
  233. data/spec/png_spec.rb +31 -28
  234. data/spec/reference_spec.rb +32 -32
  235. data/spec/repeater_spec.rb +25 -11
  236. data/spec/security_spec.rb +44 -12
  237. data/spec/snapshot_spec.rb +8 -9
  238. data/spec/soft_mask_spec.rb +117 -0
  239. data/spec/span_spec.rb +10 -15
  240. data/spec/spec_helper.rb +25 -8
  241. data/spec/stamp_spec.rb +29 -30
  242. data/spec/stream_spec.rb +58 -0
  243. data/spec/stroke_styles_spec.rb +36 -18
  244. data/spec/table/span_dummy_spec.rb +17 -0
  245. data/spec/table_spec.rb +697 -105
  246. data/spec/template_spec.rb +108 -54
  247. data/spec/text_at_spec.rb +18 -17
  248. data/spec/text_box_spec.rb +111 -62
  249. data/spec/text_rendering_mode_spec.rb +5 -5
  250. data/spec/text_spacing_spec.rb +4 -4
  251. data/spec/text_spec.rb +57 -49
  252. data/spec/transparency_spec.rb +5 -5
  253. metadata +421 -213
  254. data/data/fonts/Action Man.dfont +0 -0
  255. data/data/fonts/Activa.ttf +0 -0
  256. data/data/fonts/Chalkboard.ttf +0 -0
  257. data/data/fonts/DejaVuSans.ttf +0 -0
  258. data/data/fonts/Dustismo_Roman.ttf +0 -0
  259. data/data/fonts/comicsans.ttf +0 -0
  260. data/data/fonts/gkai00mp.ttf +0 -0
  261. data/data/images/rails.dat +0 -0
  262. data/data/images/rails.png +0 -0
  263. data/examples/bounding_box/russian_boxes.rb +0 -37
  264. data/examples/example_helper.rb +0 -11
  265. data/examples/general/context_sensitive_headers.rb +0 -38
  266. data/examples/graphics/cmyk.rb +0 -13
  267. data/examples/graphics/gradient.rb +0 -23
  268. data/examples/graphics/png_types.rb +0 -23
  269. data/examples/graphics/remote_images.rb +0 -13
  270. data/examples/m17n/full_win_ansi_character_list.rb +0 -20
  271. data/examples/m17n/sjis.rb +0 -29
  272. data/examples/table/bill.rb +0 -54
  273. data/examples/table/header.rb +0 -15
  274. data/examples/text/font_calculations.rb +0 -92
  275. data/examples/text/hyphenation.rb +0 -45
  276. data/examples/text/indent_paragraphs.rb +0 -24
  277. data/lib/prawn/core.rb +0 -85
  278. data/lib/prawn/core/text/formatted/arranger.rb +0 -294
  279. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -273
  280. data/lib/prawn/core/text/formatted/wrap.rb +0 -153
  281. data/lib/prawn/graphics/gradient.rb +0 -84
  282. data/lib/prawn/security/arcfour.rb +0 -51
@@ -12,7 +12,7 @@ require "prawn/graphics/cap_style"
12
12
  require "prawn/graphics/join_style"
13
13
  require "prawn/graphics/transparency"
14
14
  require "prawn/graphics/transformation"
15
- require "prawn/graphics/gradient"
15
+ require "prawn/graphics/patterns"
16
16
 
17
17
  module Prawn
18
18
 
@@ -30,7 +30,7 @@ module Prawn
30
30
  include JoinStyle
31
31
  include Transparency
32
32
  include Transformation
33
- include Gradient
33
+ include Patterns
34
34
 
35
35
  #######################################################################
36
36
  # Low level drawing operations must map the point to absolute coords! #
@@ -82,9 +82,9 @@ module Prawn
82
82
  x,y = map_to_absolute(point)
83
83
  add_content("%.3f %.3f %.3f %.3f re" % [ x, y - height, width, height ])
84
84
  end
85
-
85
+
86
86
  # Draws a rounded rectangle given <tt>point</tt>, <tt>width</tt> and
87
- # <tt>height</tt> and <tt>radius</tt> for the rounded corner. The rectangle
87
+ # <tt>height</tt> and <tt>radius</tt> for the rounded corner. The rectangle
88
88
  # is bounded by its upper-left corner.
89
89
  #
90
90
  # pdf.rounded_rectangle [300,300], 100, 200, 10
@@ -93,7 +93,7 @@ module Prawn
93
93
  x, y = point
94
94
  rounded_polygon(radius, point, [x + width, y], [x + width, y - height], [x, y - height])
95
95
  end
96
-
96
+
97
97
 
98
98
  ###########################################################
99
99
  # Higher level functions: May use relative coords #
@@ -138,7 +138,7 @@ module Prawn
138
138
  # current <tt>y</tt> position, or the position specified by the :at option.
139
139
  #
140
140
  # # draw a line from [25, 75] to [100, 75]
141
- # horizontal_line 25, 100, :at => 75
141
+ # horizontal_line 25, 100, :at => 75
142
142
  #
143
143
  def horizontal_line(x1,x2,options={})
144
144
  if options[:at]
@@ -146,7 +146,7 @@ module Prawn
146
146
  else
147
147
  y1 = y - bounds.absolute_bottom
148
148
  end
149
-
149
+
150
150
  line(x1,y1,x2,y1)
151
151
  end
152
152
 
@@ -222,19 +222,19 @@ module Prawn
222
222
 
223
223
  # Upper right hand corner
224
224
  curve_to [x, y + r2],
225
- :bounds => [[x + r1, y + l1], [x + l2, y + r2]]
225
+ :bounds => [[x + r1, y + l2], [x + l1, y + r2]]
226
226
 
227
227
  # Upper left hand corner
228
228
  curve_to [x - r1, y],
229
- :bounds => [[x - l2, y + r2], [x - r1, y + l1]]
229
+ :bounds => [[x - l1, y + r2], [x - r1, y + l2]]
230
230
 
231
231
  # Lower left hand corner
232
232
  curve_to [x, y - r2],
233
- :bounds => [[x - r1, y - l1], [x - l2, y - r2]]
233
+ :bounds => [[x - r1, y - l2], [x - l1, y - r2]]
234
234
 
235
235
  # Lower right hand corner
236
236
  curve_to [x + r1, y],
237
- :bounds => [[x + l2, y - r2], [x + r1, y - l1]]
237
+ :bounds => [[x + l1, y - r2], [x + r1, y - l2]]
238
238
 
239
239
  move_to(x, y)
240
240
  end
@@ -252,7 +252,7 @@ module Prawn
252
252
  # close the path
253
253
  add_content "h"
254
254
  end
255
-
255
+
256
256
  # Draws a rounded polygon from specified points using the radius to define bezier curves
257
257
  #
258
258
  # # draws a rounded filled in polygon
@@ -268,20 +268,19 @@ module Prawn
268
268
  # close the path
269
269
  add_content "h"
270
270
  end
271
-
272
-
271
+
272
+
273
273
  # Creates a rounded vertex for a line segment used for building a rounded polygon
274
274
  # requires a radius to define bezier curve and three points. The first two points define
275
275
  # the line segment and the third point helps define the curve for the vertex.
276
276
  def rounded_vertex(radius, *points)
277
- x0,y0,x1,y1,x2,y2 = points.flatten
278
277
  radial_point_1 = point_on_line(radius, points[0], points[1])
279
278
  bezier_point_1 = point_on_line((radius - radius*KAPPA), points[0], points[1] )
280
279
  radial_point_2 = point_on_line(radius, points[2], points[1])
281
280
  bezier_point_2 = point_on_line((radius - radius*KAPPA), points[2], points[1])
282
281
  line_to(radial_point_1)
283
282
  curve_to(radial_point_2, :bounds => [bezier_point_1, bezier_point_2])
284
- end
283
+ end
285
284
 
286
285
  # Strokes the current path. If a block is provided, yields to the block
287
286
  # before closing the path. See Graphics::Color for color details.
@@ -298,27 +297,99 @@ module Prawn
298
297
  yield if block_given?
299
298
  add_content "s"
300
299
  end
301
-
300
+
302
301
  # Draws and strokes a rectangle represented by the current bounding box
303
302
  #
304
303
  def stroke_bounds
305
304
  stroke_rectangle bounds.top_left, bounds.width, bounds.height
306
305
  end
307
306
 
307
+ # Draws and strokes X and Y axes rulers beginning at the current bounding
308
+ # box origin (or at a custom location).
309
+ #
310
+ # == Options
311
+ #
312
+ # +:at+::
313
+ # Origin of the X and Y axes (default: [0, 0] = origin of the bounding
314
+ # box)
315
+ #
316
+ # +:width+::
317
+ # Length of the X axis (default: width of the bounding box)
318
+ #
319
+ # +:height+::
320
+ # Length of the Y axis (default: height of the bounding box)
321
+ #
322
+ # +:step_length+::
323
+ # Length of the step between markers (default: 100)
324
+ #
325
+ # +:negative_axes_length+::
326
+ # Length of the negative parts of the axes (default: 20)
327
+ #
328
+ # +:color+:
329
+ # The color of the axes and the text.
330
+ #
331
+ def stroke_axis(options = {})
332
+ options = {
333
+ :at => [0,0],
334
+ :height => bounds.height.to_i - (options[:at] || [0,0])[1],
335
+ :width => bounds.width.to_i - (options[:at] || [0,0])[0],
336
+ :step_length => 100,
337
+ :negative_axes_length => 20,
338
+ :color => "000000",
339
+ }.merge(options)
340
+
341
+ Prawn.verify_options([:at, :width, :height, :step_length,
342
+ :negative_axes_length, :color], options)
343
+
344
+ save_graphics_state do
345
+ fill_color(options[:color])
346
+ stroke_color(options[:color])
347
+
348
+ dash(1, :space => 4)
349
+ stroke_horizontal_line(options[:at][0] - options[:negative_axes_length],
350
+ options[:at][0] + options[:width], :at => options[:at][1])
351
+ stroke_vertical_line(options[:at][1] - options[:negative_axes_length],
352
+ options[:at][1] + options[:height], :at => options[:at][0])
353
+ undash
354
+
355
+ fill_circle(options[:at], 1)
356
+
357
+ (options[:step_length]..options[:width]).step(options[:step_length]) do |point|
358
+ fill_circle([options[:at][0] + point, options[:at][1]], 1)
359
+ draw_text(point, :at => [options[:at][0] + point - 5, options[:at][1] - 10], :size => 7)
360
+ end
361
+
362
+ (options[:step_length]..options[:height]).step(options[:step_length]) do |point|
363
+ fill_circle([options[:at][0], options[:at][1] + point], 1)
364
+ draw_text(point, :at => [options[:at][0] - 17, options[:at][1] + point - 2], :size => 7)
365
+ end
366
+ end
367
+ end
368
+
308
369
  # Closes and fills the current path. See Graphics::Color for color details.
309
370
  #
310
- def fill
371
+ # If the option :fill_rule => :even_odd is specified, Prawn will use the
372
+ # even-odd rule to fill the path. Otherwise, the nonzero winding number rule
373
+ # will be used. See the PDF reference, "Graphics -> Path Construction and
374
+ # Painting -> Clipping Path Operators" for details on the difference.
375
+ #
376
+ def fill(options={})
311
377
  yield if block_given?
312
- add_content "f"
378
+ add_content(options[:fill_rule] == :even_odd ? "f*" : "f")
313
379
  end
314
380
 
315
381
  # Closes, fills, and strokes the current path. If a block is provided,
316
382
  # yields to the block before closing the path. See Graphics::Color for
317
383
  # color details.
318
384
  #
319
- def fill_and_stroke
385
+ # If the option :fill_rule => :even_odd is specified, Prawn will use the
386
+ # even-odd rule to fill the path. Otherwise, the nonzero winding number rule
387
+ # will be used. See the PDF reference, "Graphics -> Path Construction and
388
+ # Painting -> Clipping Path Operators" for details on the difference.
389
+ #
390
+ def fill_and_stroke(options={})
320
391
  yield if block_given?
321
- add_content "b"
392
+ add_content(options[:fill_rule] == :even_odd ? "b*" : "b")
322
393
  end
323
394
 
324
395
  # Closes the current path.
@@ -327,35 +398,230 @@ module Prawn
327
398
  add_content "h"
328
399
  end
329
400
 
330
- # Provides the following shortcuts:
401
+ ##
402
+ # :method: stroke_rectangle
331
403
  #
332
- # stroke_some_method(*args) #=> some_method(*args); stroke
333
- # fill_some_method(*args) #=> some_method(*args); fill
334
- # fill_and_stroke_some_method(*args) #=> some_method(*args); fill_and_stroke
404
+ # Draws and strokes a rectangle given +point+, +width+ and +height+. The
405
+ # rectangle is bounded by its upper-left corner.
335
406
  #
336
- def method_missing(id,*args,&block)
337
- case(id.to_s)
338
- when /^fill_and_stroke_(.*)/
339
- send($1,*args,&block); fill_and_stroke
340
- when /^stroke_(.*)/
341
- send($1,*args,&block); stroke
342
- when /^fill_(.*)/
343
- send($1,*args,&block); fill
344
- else
345
- super
346
- end
407
+ # :call-seq:
408
+ # stroke_rectangle(point,width,height)
409
+
410
+ ##
411
+ # :method: fill_rectangle
412
+ #
413
+ # Draws and fills ills a rectangle given +point+, +width+ and +height+. The
414
+ # rectangle is bounded by its upper-left corner.
415
+ #
416
+ # :call-seq:
417
+ # fill_rectangle(point,width,height)
418
+
419
+ ##
420
+ # :method: fill_and_stroke_rectangle
421
+ #
422
+ # Draws, fills, and strokes a rectangle given +point+, +width+ and +height+.
423
+ # The rectangle is bounded by its upper-left corner.
424
+ #
425
+ # :call-seq:
426
+ # fill_and_stroke_rectangle(point,width,height)
427
+
428
+ ##
429
+ # :method: stroke_rounded_rectangle
430
+ #
431
+ # Draws and strokes a rounded rectangle given +point+, +width+ and +height+
432
+ # and +radius+ for the rounded corner. The rectangle is bounded by its
433
+ # upper-left corner.
434
+ #
435
+ # :call-seq:
436
+ # stroke_rounded_rectangle(point,width,height,radius)
437
+
438
+ ##
439
+ # :method: fill_rounded_rectangle
440
+ #
441
+ # Draws and fills a rounded rectangle given +point+, +width+ and +height+
442
+ # and +radius+ for the rounded corner. The rectangle is bounded by its
443
+ # upper-left corner.
444
+ #
445
+ # :call-seq:
446
+ # fill_rounded_rectangle(point,width,height,radius)
447
+
448
+ ##
449
+ # :method: stroke_and_fill_rounded_rectangle
450
+ #
451
+ # Draws, fills, and strokes a rounded rectangle given +point+, +width+ and
452
+ # +height+ and +radius+ for the rounded corner. The rectangle is bounded by
453
+ # its upper-left corner.
454
+ #
455
+ # :call-seq:
456
+ # stroke_and_fill_rounded_rectangle(point,width,height,radius)
457
+
458
+ ##
459
+ # :method: stroke_line
460
+ #
461
+ # Strokes a line from one point to another. Points may be specified as
462
+ # tuples or flattened argument list.
463
+ #
464
+ # :call-seq:
465
+ # stroke_line(*points)
466
+
467
+ ##
468
+ # :method: stroke_horizontal_line
469
+ #
470
+ # Strokes a horizontal line from +x1+ to +x2+ at the current y position, or
471
+ # the position specified by the :at option.
472
+ #
473
+ # :call-seq:
474
+ # stroke_horizontal_line(x1,x2,options={})
475
+
476
+ ##
477
+ # :method: stroke_horizontal_rule
478
+ #
479
+ # Strokes a horizontal line from the left border to the right border of the
480
+ # bounding box at the current y position.
481
+ #
482
+ # :call-seq:
483
+ # stroke_horizontal_rule
484
+
485
+ ##
486
+ # :method: stroke_vertical_line
487
+ #
488
+ # Strokes a vertical line at the x coordinate given by :at from y1 to y2.
489
+ #
490
+ # :call-seq:
491
+ # stroke_vertical_line(y1,y2,params)
492
+
493
+ ##
494
+ # :method: stroke_curve
495
+ #
496
+ # Strokes a Bezier curve between two points, bounded by two additional
497
+ # points.
498
+ #
499
+ # :call-seq:
500
+ # stroke_curve(origin,dest,options={})
501
+
502
+ ##
503
+ # :method: stroke_circle
504
+ #
505
+ # Draws and strokes a circle of radius +radius+ with the centre-point at
506
+ # +point+.
507
+ #
508
+ # :call-seq:
509
+ # stroke_circle(center,radius)
510
+
511
+ ##
512
+ # :method: fill_circle
513
+ #
514
+ # Draws and fills a circle of radius +radius+ with the centre-point at
515
+ # +point+.
516
+ #
517
+ # :call-seq:
518
+ # fill_circle(center,radius)
519
+
520
+ ##
521
+ # :method: fill_and_stroke_circle
522
+ #
523
+ # Draws, strokes, and fills a circle of radius +radius+ with the
524
+ # centre-point at +point+.
525
+ #
526
+ # :call-seq:
527
+ # fill_and_stroke_circle(center,radius)
528
+
529
+ ##
530
+ # :method: stroke_ellipse
531
+ #
532
+ # Draws and strokes an ellipse of x radius +r1+ and y radius +r2+ with the
533
+ # centre-point at +point+.
534
+ #
535
+ # :call-seq:
536
+ # stroke_ellipse(point, r1, r2 = r1)
537
+
538
+ ##
539
+ # :method: fill_ellipse
540
+ #
541
+ # Draws and fills an ellipse of x radius +r1+ and y radius +r2+ with the
542
+ # centre-point at +point+.
543
+ #
544
+ # :call-seq:
545
+ # fill_ellipse(point, r1, r2 = r1)
546
+
547
+ ##
548
+ # :method: fill_and_stroke_ellipse
549
+ #
550
+ # Draws, strokes, and fills an ellipse of x radius +r1+ and y radius +r2+
551
+ # with the centre-point at +point+.
552
+ #
553
+ # :call-seq:
554
+ # fill_and_stroke_ellipse(point, r1, r2 = r1)
555
+
556
+ ##
557
+ # :method: stroke_polygon
558
+ #
559
+ # Draws and strokes a polygon from the specified points.
560
+ #
561
+ # :call-seq:
562
+ # stroke_polygon(*points)
563
+
564
+ ##
565
+ # :method: fill_polygon
566
+ #
567
+ # Draws and fills a polygon from the specified points.
568
+ #
569
+ # :call-seq:
570
+ # fill_polygon(*points)
571
+
572
+ ##
573
+ # :method: fill_and_stroke_polygon
574
+ #
575
+ # Draws, strokes, and fills a polygon from the specified points.
576
+ #
577
+ # :call-seq:
578
+ # fill_and_stroke_polygon(*points)
579
+
580
+ ##
581
+ # :method: stroke_rounded_polygon
582
+ #
583
+ # Draws and strokes a rounded polygon from specified points, using +radius+
584
+ # to define Bezier curves.
585
+ #
586
+ # :call-seq:
587
+ # stroke_rounded_polygon(radius, *points)
588
+
589
+ ##
590
+ # :method: fill_rounded_polygon
591
+ #
592
+ # Draws and fills a rounded polygon from specified points, using +radius+ to
593
+ # define Bezier curves.
594
+ #
595
+ # :call-seq:
596
+ # fill_rounded_polygon(radius, *points)
597
+
598
+ ##
599
+ # :method: fill_and_stroke_rounded_polygon
600
+ #
601
+ # Draws, strokes, and fills a rounded polygon from specified points, using
602
+ # +radius+ to define Bezier curves.
603
+ #
604
+ # :call-seq:
605
+ # fill_and_stroke_rounded_polygon(radius, *points)
606
+
607
+ ops = %w{fill stroke fill_and_stroke}
608
+ shapes = %w{line_to curve_to rectangle rounded_rectangle line horizontal_line horizontal_rule vertical_line
609
+ curve circle_at circle ellipse_at ellipse polygon rounded_polygon rounded_vertex}
610
+
611
+ ops.product(shapes).each do |operation,shape|
612
+ class_eval "def #{operation}_#{shape}(*args); #{shape}(*args); #{operation}; end"
347
613
  end
348
614
 
349
615
  private
350
-
616
+
351
617
  def current_line_width
352
618
  graphic_state.line_width
353
619
  end
354
-
620
+
355
621
  def current_line_width=(width)
356
622
  graphic_state.line_width = width
357
623
  end
358
-
624
+
359
625
  def write_line_width
360
626
  add_content("#{current_line_width} w")
361
627
  end
@@ -372,7 +638,7 @@ module Prawn
372
638
  def degree_to_rad(angle)
373
639
  angle * Math::PI / 180
374
640
  end
375
-
641
+
376
642
  # Returns the coordinates for a point on a line that is a given distance away from the second
377
643
  # point defining the line segement
378
644
  def point_on_line(distance_from_end, *points)
@@ -383,6 +649,6 @@ module Prawn
383
649
  yr = y0 + p*(y1 - y0)
384
650
  [xr, yr]
385
651
  end
386
-
652
+
387
653
  end
388
654
  end