prawn 0.11.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (353) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +10 -0
  3. data/COPYING +2 -2
  4. data/GPLv2 +340 -0
  5. data/GPLv3 +674 -0
  6. data/Gemfile +11 -0
  7. data/LICENSE +1 -1
  8. data/Rakefile +29 -38
  9. data/data/images/16bit.alpha +0 -0
  10. data/data/images/16bit.color +0 -0
  11. data/data/images/dice.alpha +0 -0
  12. data/data/images/dice.color +0 -0
  13. data/data/images/indexed_color.dat +0 -0
  14. data/data/images/indexed_color.png +0 -0
  15. data/data/images/page_white_text.alpha +0 -0
  16. data/data/images/page_white_text.color +0 -0
  17. data/data/pdfs/nested_pages.pdf +13 -13
  18. data/lib/prawn/document/bounding_box.rb +87 -12
  19. data/lib/prawn/document/column_box.rb +57 -28
  20. data/lib/prawn/document/graphics_state.rb +11 -74
  21. data/lib/prawn/document/internals.rb +25 -23
  22. data/lib/prawn/document/snapshot.rb +11 -8
  23. data/lib/prawn/document/span.rb +12 -10
  24. data/lib/prawn/document.rb +250 -194
  25. data/lib/prawn/encoding.rb +9 -10
  26. data/lib/prawn/errors.rb +18 -29
  27. data/lib/prawn/font/afm.rb +52 -41
  28. data/lib/prawn/font/dfont.rb +4 -3
  29. data/lib/prawn/font/ttf.rb +44 -48
  30. data/lib/prawn/font.rb +138 -88
  31. data/lib/prawn/font_metric_cache.rb +47 -0
  32. data/lib/prawn/graphics/cap_style.rb +4 -3
  33. data/lib/prawn/graphics/color.rb +13 -5
  34. data/lib/prawn/graphics/dash.rb +53 -31
  35. data/lib/prawn/graphics/join_style.rb +9 -7
  36. data/lib/prawn/graphics/patterns.rb +138 -0
  37. data/lib/prawn/graphics/transformation.rb +10 -9
  38. data/lib/prawn/graphics/transparency.rb +3 -1
  39. data/lib/prawn/graphics.rb +316 -61
  40. data/lib/prawn/image_handler.rb +36 -0
  41. data/lib/prawn/images/image.rb +49 -0
  42. data/lib/prawn/images/jpg.rb +21 -15
  43. data/lib/prawn/images/png.rb +62 -119
  44. data/lib/prawn/images.rb +89 -108
  45. data/lib/prawn/layout/grid.rb +66 -54
  46. data/lib/prawn/layout.rb +10 -15
  47. data/lib/prawn/measurement_extensions.rb +10 -6
  48. data/lib/prawn/measurements.rb +27 -21
  49. data/lib/prawn/outline.rb +6 -308
  50. data/lib/prawn/repeater.rb +11 -9
  51. data/lib/prawn/security/arcfour.rb +1 -0
  52. data/lib/prawn/security.rb +55 -33
  53. data/lib/prawn/soft_mask.rb +96 -0
  54. data/lib/prawn/stamp.rb +5 -3
  55. data/lib/prawn/table/cell/image.rb +69 -0
  56. data/lib/prawn/table/cell/in_table.rb +4 -2
  57. data/lib/prawn/table/cell/span_dummy.rb +93 -0
  58. data/lib/prawn/table/cell/subtable.rb +2 -2
  59. data/lib/prawn/table/cell/text.rb +44 -26
  60. data/lib/prawn/table/cell.rb +302 -50
  61. data/lib/prawn/table/cells.rb +147 -49
  62. data/lib/prawn/table/column_width_calculator.rb +61 -0
  63. data/lib/prawn/table.rb +297 -118
  64. data/lib/prawn/text/box.rb +21 -5
  65. data/lib/prawn/text/formatted/arranger.rb +290 -0
  66. data/lib/prawn/text/formatted/box.rb +103 -59
  67. data/lib/prawn/text/formatted/fragment.rb +34 -23
  68. data/lib/prawn/text/formatted/line_wrap.rb +266 -0
  69. data/lib/prawn/text/formatted/parser.rb +15 -5
  70. data/lib/prawn/text/formatted/wrap.rb +150 -0
  71. data/lib/prawn/text/formatted.rb +5 -4
  72. data/lib/prawn/text.rb +38 -24
  73. data/lib/prawn/utilities.rb +46 -0
  74. data/lib/prawn.rb +85 -20
  75. data/manual/basic_concepts/adding_pages.rb +27 -0
  76. data/manual/basic_concepts/basic_concepts.rb +34 -0
  77. data/manual/basic_concepts/creation.rb +39 -0
  78. data/manual/basic_concepts/cursor.rb +33 -0
  79. data/manual/basic_concepts/measurement.rb +25 -0
  80. data/manual/basic_concepts/origin.rb +38 -0
  81. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  82. data/manual/bounding_box/bounding_box.rb +39 -0
  83. data/manual/bounding_box/bounds.rb +49 -0
  84. data/manual/bounding_box/canvas.rb +24 -0
  85. data/manual/bounding_box/creation.rb +23 -0
  86. data/manual/bounding_box/indentation.rb +46 -0
  87. data/manual/bounding_box/nesting.rb +45 -0
  88. data/manual/bounding_box/russian_boxes.rb +40 -0
  89. data/manual/bounding_box/stretchy.rb +31 -0
  90. data/manual/document_and_page_options/background.rb +27 -0
  91. data/manual/document_and_page_options/document_and_page_options.rb +32 -0
  92. data/manual/document_and_page_options/metadata.rb +23 -0
  93. data/manual/document_and_page_options/page_margins.rb +38 -0
  94. data/manual/document_and_page_options/page_size.rb +34 -0
  95. data/manual/document_and_page_options/print_scaling.rb +20 -0
  96. data/manual/example_file.rb +111 -0
  97. data/manual/example_helper.rb +411 -0
  98. data/manual/example_package.rb +53 -0
  99. data/manual/example_section.rb +46 -0
  100. data/manual/graphics/circle_and_ellipse.rb +22 -0
  101. data/manual/graphics/color.rb +24 -0
  102. data/manual/graphics/common_lines.rb +30 -0
  103. data/manual/graphics/fill_and_stroke.rb +42 -0
  104. data/manual/graphics/fill_rules.rb +37 -0
  105. data/manual/graphics/gradients.rb +37 -0
  106. data/manual/graphics/graphics.rb +58 -0
  107. data/manual/graphics/helper.rb +24 -0
  108. data/manual/graphics/line_width.rb +35 -0
  109. data/manual/graphics/lines_and_curves.rb +41 -0
  110. data/manual/graphics/polygon.rb +29 -0
  111. data/manual/graphics/rectangle.rb +21 -0
  112. data/manual/graphics/rotate.rb +28 -0
  113. data/manual/graphics/scale.rb +41 -0
  114. data/manual/graphics/soft_masks.rb +46 -0
  115. data/manual/graphics/stroke_cap.rb +31 -0
  116. data/manual/graphics/stroke_dash.rb +48 -0
  117. data/manual/graphics/stroke_join.rb +30 -0
  118. data/manual/graphics/translate.rb +29 -0
  119. data/manual/graphics/transparency.rb +35 -0
  120. data/manual/images/absolute_position.rb +23 -0
  121. data/manual/images/fit.rb +21 -0
  122. data/manual/images/horizontal.rb +25 -0
  123. data/manual/images/images.rb +40 -0
  124. data/manual/images/plain_image.rb +18 -0
  125. data/manual/images/scale.rb +22 -0
  126. data/manual/images/vertical.rb +28 -0
  127. data/manual/images/width_and_height.rb +25 -0
  128. data/manual/layout/boxes.rb +27 -0
  129. data/manual/layout/content.rb +25 -0
  130. data/manual/layout/layout.rb +28 -0
  131. data/manual/layout/simple_grid.rb +23 -0
  132. data/manual/manual/cover.rb +36 -0
  133. data/manual/manual/foreword.rb +85 -0
  134. data/manual/manual/how_to_read_this_manual.rb +41 -0
  135. data/manual/manual/manual.rb +34 -0
  136. data/manual/outline/add_subsection_to.rb +61 -0
  137. data/manual/outline/insert_section_after.rb +47 -0
  138. data/manual/outline/outline.rb +32 -0
  139. data/manual/outline/sections_and_pages.rb +67 -0
  140. data/manual/repeatable_content/page_numbering.rb +54 -0
  141. data/manual/repeatable_content/repeatable_content.rb +31 -0
  142. data/manual/repeatable_content/repeater.rb +55 -0
  143. data/manual/repeatable_content/stamp.rb +41 -0
  144. data/manual/security/encryption.rb +31 -0
  145. data/manual/security/permissions.rb +38 -0
  146. data/manual/security/security.rb +28 -0
  147. data/manual/syntax_highlight.rb +52 -0
  148. data/manual/table/basic_block.rb +53 -0
  149. data/manual/table/before_rendering_page.rb +26 -0
  150. data/manual/table/cell_border_lines.rb +24 -0
  151. data/manual/table/cell_borders_and_bg.rb +31 -0
  152. data/manual/table/cell_dimensions.rb +30 -0
  153. data/manual/table/cell_text.rb +38 -0
  154. data/manual/table/column_widths.rb +30 -0
  155. data/manual/table/content_and_subtables.rb +39 -0
  156. data/manual/table/creation.rb +27 -0
  157. data/manual/table/filtering.rb +36 -0
  158. data/manual/table/flow_and_header.rb +17 -0
  159. data/manual/table/image_cells.rb +33 -0
  160. data/manual/table/position.rb +29 -0
  161. data/manual/table/row_colors.rb +20 -0
  162. data/manual/table/span.rb +30 -0
  163. data/manual/table/style.rb +22 -0
  164. data/manual/table/table.rb +52 -0
  165. data/manual/table/width.rb +27 -0
  166. data/manual/text/alignment.rb +44 -0
  167. data/manual/text/color.rb +24 -0
  168. data/manual/text/column_box.rb +32 -0
  169. data/manual/text/fallback_fonts.rb +37 -0
  170. data/manual/text/font.rb +41 -0
  171. data/manual/text/font_size.rb +45 -0
  172. data/manual/text/font_style.rb +23 -0
  173. data/manual/text/formatted_callbacks.rb +60 -0
  174. data/manual/text/formatted_text.rb +54 -0
  175. data/manual/text/free_flowing_text.rb +51 -0
  176. data/manual/text/group.rb +31 -0
  177. data/manual/text/inline.rb +43 -0
  178. data/manual/text/kerning_and_character_spacing.rb +39 -0
  179. data/manual/text/leading.rb +25 -0
  180. data/manual/text/line_wrapping.rb +41 -0
  181. data/manual/text/paragraph_indentation.rb +26 -0
  182. data/manual/text/positioned_text.rb +38 -0
  183. data/manual/text/registering_families.rb +48 -0
  184. data/manual/text/rendering_and_color.rb +37 -0
  185. data/manual/text/right_to_left_text.rb +43 -0
  186. data/manual/text/rotation.rb +43 -0
  187. data/manual/text/single_usage.rb +37 -0
  188. data/manual/text/text.rb +75 -0
  189. data/manual/text/text_box_excess.rb +32 -0
  190. data/manual/text/text_box_extensions.rb +45 -0
  191. data/manual/text/text_box_overflow.rb +44 -0
  192. data/manual/text/utf8.rb +28 -0
  193. data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
  194. data/prawn.gemspec +27 -17
  195. data/spec/acceptance/png.rb +23 -0
  196. data/spec/annotations_spec.rb +16 -32
  197. data/spec/bounding_box_spec.rb +284 -2
  198. data/spec/cell_spec.rb +169 -38
  199. data/spec/column_box_spec.rb +65 -0
  200. data/spec/data/curves.pdf +66 -0
  201. data/spec/destinations_spec.rb +5 -5
  202. data/spec/document_spec.rb +212 -113
  203. data/spec/extensions/encoding_helpers.rb +9 -0
  204. data/spec/extensions/mocha.rb +2 -3
  205. data/spec/font_metric_cache_spec.rb +52 -0
  206. data/spec/font_spec.rb +205 -95
  207. data/spec/formatted_text_arranger_spec.rb +43 -43
  208. data/spec/formatted_text_box_spec.rb +63 -24
  209. data/spec/formatted_text_fragment_spec.rb +8 -8
  210. data/spec/graphics_spec.rb +175 -68
  211. data/spec/grid_spec.rb +26 -15
  212. data/spec/image_handler_spec.rb +54 -0
  213. data/spec/images_spec.rb +58 -30
  214. data/spec/inline_formatted_text_parser_spec.rb +73 -19
  215. data/spec/jpg_spec.rb +4 -4
  216. data/spec/line_wrap_spec.rb +28 -28
  217. data/spec/measurement_units_spec.rb +6 -6
  218. data/spec/object_store_spec.rb +17 -106
  219. data/spec/outline_spec.rb +103 -63
  220. data/spec/png_spec.rb +25 -25
  221. data/spec/reference_spec.rb +8 -65
  222. data/spec/repeater_spec.rb +25 -11
  223. data/spec/security_spec.rb +44 -12
  224. data/spec/snapshot_spec.rb +38 -6
  225. data/spec/soft_mask_spec.rb +117 -0
  226. data/spec/span_spec.rb +10 -15
  227. data/spec/spec_helper.rb +32 -8
  228. data/spec/stamp_spec.rb +29 -30
  229. data/spec/stroke_styles_spec.rb +36 -18
  230. data/spec/table/span_dummy_spec.rb +17 -0
  231. data/spec/table_spec.rb +850 -104
  232. data/spec/text_at_spec.rb +19 -33
  233. data/spec/text_box_spec.rb +117 -64
  234. data/spec/text_rendering_mode_spec.rb +5 -5
  235. data/spec/text_spacing_spec.rb +20 -2
  236. data/spec/text_spec.rb +111 -59
  237. data/spec/transparency_spec.rb +5 -5
  238. metadata +477 -328
  239. data/HACKING +0 -50
  240. data/README +0 -141
  241. data/data/fonts/Action Man.dfont +0 -0
  242. data/data/fonts/Activa.ttf +0 -0
  243. data/data/fonts/Chalkboard.ttf +0 -0
  244. data/data/fonts/DejaVuSans.ttf +0 -0
  245. data/data/fonts/Dustismo_Roman.ttf +0 -0
  246. data/data/fonts/comicsans.ttf +0 -0
  247. data/data/fonts/gkai00mp.ttf +0 -0
  248. data/data/images/16bit.dat +0 -0
  249. data/data/images/dice.dat +0 -0
  250. data/data/images/page_white_text.dat +0 -0
  251. data/data/images/rails.dat +0 -0
  252. data/data/images/rails.png +0 -0
  253. data/examples/bounding_box/bounding_boxes.rb +0 -44
  254. data/examples/bounding_box/indentation.rb +0 -35
  255. data/examples/bounding_box/russian_boxes.rb +0 -37
  256. data/examples/bounding_box/stretched_nesting.rb +0 -68
  257. data/examples/example_helper.rb +0 -8
  258. data/examples/general/background.rb +0 -24
  259. data/examples/general/canvas.rb +0 -16
  260. data/examples/general/context_sensitive_headers.rb +0 -38
  261. data/examples/general/float.rb +0 -12
  262. data/examples/general/margin.rb +0 -37
  263. data/examples/general/measurement_units.rb +0 -52
  264. data/examples/general/metadata-info.rb +0 -17
  265. data/examples/general/multi_page_layout.rb +0 -19
  266. data/examples/general/outlines.rb +0 -67
  267. data/examples/general/page_geometry.rb +0 -32
  268. data/examples/general/page_numbering.rb +0 -40
  269. data/examples/general/page_templates.rb +0 -20
  270. data/examples/general/repeaters.rb +0 -48
  271. data/examples/general/stamp.rb +0 -42
  272. data/examples/general/templates.rb +0 -14
  273. data/examples/graphics/basic_images.rb +0 -24
  274. data/examples/graphics/cmyk.rb +0 -13
  275. data/examples/graphics/curves.rb +0 -12
  276. data/examples/graphics/gradient.rb +0 -23
  277. data/examples/graphics/hexagon.rb +0 -14
  278. data/examples/graphics/image_fit.rb +0 -16
  279. data/examples/graphics/image_flow.rb +0 -38
  280. data/examples/graphics/image_position.rb +0 -18
  281. data/examples/graphics/line.rb +0 -33
  282. data/examples/graphics/png_types.rb +0 -23
  283. data/examples/graphics/polygons.rb +0 -17
  284. data/examples/graphics/remote_images.rb +0 -13
  285. data/examples/graphics/rounded_polygons.rb +0 -20
  286. data/examples/graphics/rounded_rectangle.rb +0 -21
  287. data/examples/graphics/ruport_style_helpers.rb +0 -20
  288. data/examples/graphics/stroke_bounds.rb +0 -21
  289. data/examples/graphics/stroke_cap_and_join.rb +0 -46
  290. data/examples/graphics/stroke_dash.rb +0 -43
  291. data/examples/graphics/transformations.rb +0 -53
  292. data/examples/graphics/transparency.rb +0 -27
  293. data/examples/grid/bounding_boxes.rb +0 -22
  294. data/examples/grid/column_gutter_grid.rb +0 -21
  295. data/examples/grid/multi_boxes.rb +0 -52
  296. data/examples/grid/show_grid.rb +0 -14
  297. data/examples/grid/simple_grid.rb +0 -21
  298. data/examples/m17n/chinese_text_wrapping.rb +0 -18
  299. data/examples/m17n/euro.rb +0 -16
  300. data/examples/m17n/full_win_ansi_character_list.rb +0 -20
  301. data/examples/m17n/sjis.rb +0 -29
  302. data/examples/m17n/utf8.rb +0 -14
  303. data/examples/security/hello_foo.rb +0 -9
  304. data/examples/table/bill.rb +0 -54
  305. data/examples/table/borders.rb +0 -25
  306. data/examples/table/cell.rb +0 -13
  307. data/examples/table/checkerboard.rb +0 -23
  308. data/examples/table/header.rb +0 -15
  309. data/examples/table/inline_format_table.rb +0 -13
  310. data/examples/table/multi_page_table.rb +0 -10
  311. data/examples/table/simple_table.rb +0 -25
  312. data/examples/table/subtable.rb +0 -13
  313. data/examples/table/widths.rb +0 -21
  314. data/examples/text/alignment.rb +0 -19
  315. data/examples/text/character_spacing.rb +0 -13
  316. data/examples/text/dfont.rb +0 -49
  317. data/examples/text/family_based_styling.rb +0 -25
  318. data/examples/text/font_calculations.rb +0 -92
  319. data/examples/text/font_size.rb +0 -34
  320. data/examples/text/hyphenation.rb +0 -45
  321. data/examples/text/indent_paragraphs.rb +0 -24
  322. data/examples/text/inline_format.rb +0 -104
  323. data/examples/text/kerning.rb +0 -31
  324. data/examples/text/rendering_mode.rb +0 -21
  325. data/examples/text/rotated.rb +0 -99
  326. data/examples/text/shaped_text_box.rb +0 -32
  327. data/examples/text/simple_text.rb +0 -18
  328. data/examples/text/simple_text_ttf.rb +0 -18
  329. data/examples/text/span.rb +0 -30
  330. data/examples/text/text_box.rb +0 -90
  331. data/examples/text/text_box_returning_excess.rb +0 -52
  332. data/examples/text/text_flow.rb +0 -68
  333. data/lib/prawn/compatibility.rb +0 -51
  334. data/lib/prawn/core/annotations.rb +0 -61
  335. data/lib/prawn/core/byte_string.rb +0 -9
  336. data/lib/prawn/core/destinations.rb +0 -90
  337. data/lib/prawn/core/document_state.rb +0 -78
  338. data/lib/prawn/core/literal_string.rb +0 -16
  339. data/lib/prawn/core/name_tree.rb +0 -165
  340. data/lib/prawn/core/object_store.rb +0 -264
  341. data/lib/prawn/core/page.rb +0 -213
  342. data/lib/prawn/core/pdf_object.rb +0 -108
  343. data/lib/prawn/core/reference.rb +0 -112
  344. data/lib/prawn/core/text/formatted/arranger.rb +0 -293
  345. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -272
  346. data/lib/prawn/core/text/formatted/wrap.rb +0 -149
  347. data/lib/prawn/core/text.rb +0 -268
  348. data/lib/prawn/core.rb +0 -85
  349. data/lib/prawn/document/page_geometry.rb +0 -136
  350. data/lib/prawn/graphics/gradient.rb +0 -84
  351. data/spec/name_tree_spec.rb +0 -112
  352. data/spec/pdf_object_spec.rb +0 -170
  353. data/spec/template_spec.rb +0 -291
@@ -6,13 +6,14 @@
6
6
  #
7
7
  # This is free software. Please see the LICENSE and COPYING files for details.
8
8
 
9
- require "prawn/graphics/color"
10
- require "prawn/graphics/dash"
11
- require "prawn/graphics/cap_style"
12
- require "prawn/graphics/join_style"
13
- require "prawn/graphics/transparency"
14
- require "prawn/graphics/transformation"
15
- require "prawn/graphics/gradient"
9
+
10
+ require_relative "graphics/color"
11
+ require_relative "graphics/dash"
12
+ require_relative "graphics/cap_style"
13
+ require_relative "graphics/join_style"
14
+ require_relative "graphics/transparency"
15
+ require_relative "graphics/transformation"
16
+ require_relative "graphics/patterns"
16
17
 
17
18
  module Prawn
18
19
 
@@ -30,7 +31,9 @@ module Prawn
30
31
  include JoinStyle
31
32
  include Transparency
32
33
  include Transformation
33
- include Gradient
34
+ include Patterns
35
+
36
+ # @group Stable API
34
37
 
35
38
  #######################################################################
36
39
  # Low level drawing operations must map the point to absolute coords! #
@@ -82,9 +85,9 @@ module Prawn
82
85
  x,y = map_to_absolute(point)
83
86
  add_content("%.3f %.3f %.3f %.3f re" % [ x, y - height, width, height ])
84
87
  end
85
-
88
+
86
89
  # 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
90
+ # <tt>height</tt> and <tt>radius</tt> for the rounded corner. The rectangle
88
91
  # is bounded by its upper-left corner.
89
92
  #
90
93
  # pdf.rounded_rectangle [300,300], 100, 200, 10
@@ -93,7 +96,7 @@ module Prawn
93
96
  x, y = point
94
97
  rounded_polygon(radius, point, [x + width, y], [x + width, y - height], [x, y - height])
95
98
  end
96
-
99
+
97
100
 
98
101
  ###########################################################
99
102
  # Higher level functions: May use relative coords #
@@ -138,7 +141,7 @@ module Prawn
138
141
  # current <tt>y</tt> position, or the position specified by the :at option.
139
142
  #
140
143
  # # draw a line from [25, 75] to [100, 75]
141
- # horizontal_line 25, 100, :at => 75
144
+ # horizontal_line 25, 100, :at => 75
142
145
  #
143
146
  def horizontal_line(x1,x2,options={})
144
147
  if options[:at]
@@ -146,7 +149,7 @@ module Prawn
146
149
  else
147
150
  y1 = y - bounds.absolute_bottom
148
151
  end
149
-
152
+
150
153
  line(x1,y1,x2,y1)
151
154
  end
152
155
 
@@ -181,13 +184,6 @@ module Prawn
181
184
  #
182
185
  KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0)
183
186
 
184
- # <b>DEPRECATED:</b> Please use <tt>circle</tt> instead.
185
- def circle_at(point, options)
186
- warn "[DEPRECATION] 'circle_at' is deprecated in favor of 'circle'. " +
187
- "'circle_at' will be removed in release 1.1"
188
- circle(point, options[:radius])
189
- end
190
-
191
187
  # Draws a circle of radius <tt>radius</tt> with the centre-point at <tt>point</tt>
192
188
  # as a complete subpath. The drawing point will be moved to the
193
189
  # centre-point upon completion of the drawing the circle.
@@ -198,13 +194,6 @@ module Prawn
198
194
  ellipse(center, radius, radius)
199
195
  end
200
196
 
201
- # <b>DEPRECATED:</b> Please use <tt>ellipse</tt> instead.
202
- def ellipse_at(point, r1, r2=r1)
203
- warn "[DEPRECATION] 'ellipse_at' is deprecated in favor of 'ellipse'. " +
204
- "'ellipse_at' will be removed in release 1.1"
205
- ellipse(point, r1, r2)
206
- end
207
-
208
197
  # Draws an ellipse of +x+ radius <tt>r1</tt> and +y+ radius <tt>r2</tt>
209
198
  # with the centre-point at <tt>point</tt> as a complete subpath. The
210
199
  # drawing point will be moved to the centre-point upon completion of the
@@ -222,19 +211,19 @@ module Prawn
222
211
 
223
212
  # Upper right hand corner
224
213
  curve_to [x, y + r2],
225
- :bounds => [[x + r1, y + l1], [x + l2, y + r2]]
214
+ :bounds => [[x + r1, y + l2], [x + l1, y + r2]]
226
215
 
227
216
  # Upper left hand corner
228
217
  curve_to [x - r1, y],
229
- :bounds => [[x - l2, y + r2], [x - r1, y + l1]]
218
+ :bounds => [[x - l1, y + r2], [x - r1, y + l2]]
230
219
 
231
220
  # Lower left hand corner
232
221
  curve_to [x, y - r2],
233
- :bounds => [[x - r1, y - l1], [x - l2, y - r2]]
222
+ :bounds => [[x - r1, y - l2], [x - l1, y - r2]]
234
223
 
235
224
  # Lower right hand corner
236
225
  curve_to [x + r1, y],
237
- :bounds => [[x + l2, y - r2], [x + r1, y - l1]]
226
+ :bounds => [[x + l1, y - r2], [x + r1, y - l2]]
238
227
 
239
228
  move_to(x, y)
240
229
  end
@@ -252,7 +241,7 @@ module Prawn
252
241
  # close the path
253
242
  add_content "h"
254
243
  end
255
-
244
+
256
245
  # Draws a rounded polygon from specified points using the radius to define bezier curves
257
246
  #
258
247
  # # draws a rounded filled in polygon
@@ -268,20 +257,19 @@ module Prawn
268
257
  # close the path
269
258
  add_content "h"
270
259
  end
271
-
272
-
260
+
261
+
273
262
  # Creates a rounded vertex for a line segment used for building a rounded polygon
274
263
  # requires a radius to define bezier curve and three points. The first two points define
275
264
  # the line segment and the third point helps define the curve for the vertex.
276
265
  def rounded_vertex(radius, *points)
277
- x0,y0,x1,y1,x2,y2 = points.flatten
278
266
  radial_point_1 = point_on_line(radius, points[0], points[1])
279
267
  bezier_point_1 = point_on_line((radius - radius*KAPPA), points[0], points[1] )
280
268
  radial_point_2 = point_on_line(radius, points[2], points[1])
281
269
  bezier_point_2 = point_on_line((radius - radius*KAPPA), points[2], points[1])
282
270
  line_to(radial_point_1)
283
271
  curve_to(radial_point_2, :bounds => [bezier_point_1, bezier_point_2])
284
- end
272
+ end
285
273
 
286
274
  # Strokes the current path. If a block is provided, yields to the block
287
275
  # before closing the path. See Graphics::Color for color details.
@@ -298,27 +286,99 @@ module Prawn
298
286
  yield if block_given?
299
287
  add_content "s"
300
288
  end
301
-
289
+
302
290
  # Draws and strokes a rectangle represented by the current bounding box
303
291
  #
304
292
  def stroke_bounds
305
293
  stroke_rectangle bounds.top_left, bounds.width, bounds.height
306
294
  end
307
295
 
296
+ # Draws and strokes X and Y axes rulers beginning at the current bounding
297
+ # box origin (or at a custom location).
298
+ #
299
+ # == Options
300
+ #
301
+ # +:at+::
302
+ # Origin of the X and Y axes (default: [0, 0] = origin of the bounding
303
+ # box)
304
+ #
305
+ # +:width+::
306
+ # Length of the X axis (default: width of the bounding box)
307
+ #
308
+ # +:height+::
309
+ # Length of the Y axis (default: height of the bounding box)
310
+ #
311
+ # +:step_length+::
312
+ # Length of the step between markers (default: 100)
313
+ #
314
+ # +:negative_axes_length+::
315
+ # Length of the negative parts of the axes (default: 20)
316
+ #
317
+ # +:color+:
318
+ # The color of the axes and the text.
319
+ #
320
+ def stroke_axis(options = {})
321
+ options = {
322
+ :at => [0,0],
323
+ :height => bounds.height.to_i - (options[:at] || [0,0])[1],
324
+ :width => bounds.width.to_i - (options[:at] || [0,0])[0],
325
+ :step_length => 100,
326
+ :negative_axes_length => 20,
327
+ :color => "000000",
328
+ }.merge(options)
329
+
330
+ Prawn.verify_options([:at, :width, :height, :step_length,
331
+ :negative_axes_length, :color], options)
332
+
333
+ save_graphics_state do
334
+ fill_color(options[:color])
335
+ stroke_color(options[:color])
336
+
337
+ dash(1, :space => 4)
338
+ stroke_horizontal_line(options[:at][0] - options[:negative_axes_length],
339
+ options[:at][0] + options[:width], :at => options[:at][1])
340
+ stroke_vertical_line(options[:at][1] - options[:negative_axes_length],
341
+ options[:at][1] + options[:height], :at => options[:at][0])
342
+ undash
343
+
344
+ fill_circle(options[:at], 1)
345
+
346
+ (options[:step_length]..options[:width]).step(options[:step_length]) do |point|
347
+ fill_circle([options[:at][0] + point, options[:at][1]], 1)
348
+ draw_text(point, :at => [options[:at][0] + point - 5, options[:at][1] - 10], :size => 7)
349
+ end
350
+
351
+ (options[:step_length]..options[:height]).step(options[:step_length]) do |point|
352
+ fill_circle([options[:at][0], options[:at][1] + point], 1)
353
+ draw_text(point, :at => [options[:at][0] - 17, options[:at][1] + point - 2], :size => 7)
354
+ end
355
+ end
356
+ end
357
+
308
358
  # Closes and fills the current path. See Graphics::Color for color details.
309
359
  #
310
- def fill
360
+ # If the option :fill_rule => :even_odd is specified, Prawn will use the
361
+ # even-odd rule to fill the path. Otherwise, the nonzero winding number rule
362
+ # will be used. See the PDF reference, "Graphics -> Path Construction and
363
+ # Painting -> Clipping Path Operators" for details on the difference.
364
+ #
365
+ def fill(options={})
311
366
  yield if block_given?
312
- add_content "f"
367
+ add_content(options[:fill_rule] == :even_odd ? "f*" : "f")
313
368
  end
314
369
 
315
370
  # Closes, fills, and strokes the current path. If a block is provided,
316
371
  # yields to the block before closing the path. See Graphics::Color for
317
372
  # color details.
318
373
  #
319
- def fill_and_stroke
374
+ # If the option :fill_rule => :even_odd is specified, Prawn will use the
375
+ # even-odd rule to fill the path. Otherwise, the nonzero winding number rule
376
+ # will be used. See the PDF reference, "Graphics -> Path Construction and
377
+ # Painting -> Clipping Path Operators" for details on the difference.
378
+ #
379
+ def fill_and_stroke(options={})
320
380
  yield if block_given?
321
- add_content "b"
381
+ add_content(options[:fill_rule] == :even_odd ? "b*" : "b")
322
382
  end
323
383
 
324
384
  # Closes the current path.
@@ -327,35 +387,230 @@ module Prawn
327
387
  add_content "h"
328
388
  end
329
389
 
330
- # Provides the following shortcuts:
390
+ ##
391
+ # :method: stroke_rectangle
331
392
  #
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
393
+ # Draws and strokes a rectangle given +point+, +width+ and +height+. The
394
+ # rectangle is bounded by its upper-left corner.
335
395
  #
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
396
+ # :call-seq:
397
+ # stroke_rectangle(point,width,height)
398
+
399
+ ##
400
+ # :method: fill_rectangle
401
+ #
402
+ # Draws and fills ills a rectangle given +point+, +width+ and +height+. The
403
+ # rectangle is bounded by its upper-left corner.
404
+ #
405
+ # :call-seq:
406
+ # fill_rectangle(point,width,height)
407
+
408
+ ##
409
+ # :method: fill_and_stroke_rectangle
410
+ #
411
+ # Draws, fills, and strokes a rectangle given +point+, +width+ and +height+.
412
+ # The rectangle is bounded by its upper-left corner.
413
+ #
414
+ # :call-seq:
415
+ # fill_and_stroke_rectangle(point,width,height)
416
+
417
+ ##
418
+ # :method: stroke_rounded_rectangle
419
+ #
420
+ # Draws and strokes a rounded rectangle given +point+, +width+ and +height+
421
+ # and +radius+ for the rounded corner. The rectangle is bounded by its
422
+ # upper-left corner.
423
+ #
424
+ # :call-seq:
425
+ # stroke_rounded_rectangle(point,width,height,radius)
426
+
427
+ ##
428
+ # :method: fill_rounded_rectangle
429
+ #
430
+ # Draws and fills a rounded rectangle given +point+, +width+ and +height+
431
+ # and +radius+ for the rounded corner. The rectangle is bounded by its
432
+ # upper-left corner.
433
+ #
434
+ # :call-seq:
435
+ # fill_rounded_rectangle(point,width,height,radius)
436
+
437
+ ##
438
+ # :method: stroke_and_fill_rounded_rectangle
439
+ #
440
+ # Draws, fills, and strokes a rounded rectangle given +point+, +width+ and
441
+ # +height+ and +radius+ for the rounded corner. The rectangle is bounded by
442
+ # its upper-left corner.
443
+ #
444
+ # :call-seq:
445
+ # stroke_and_fill_rounded_rectangle(point,width,height,radius)
446
+
447
+ ##
448
+ # :method: stroke_line
449
+ #
450
+ # Strokes a line from one point to another. Points may be specified as
451
+ # tuples or flattened argument list.
452
+ #
453
+ # :call-seq:
454
+ # stroke_line(*points)
455
+
456
+ ##
457
+ # :method: stroke_horizontal_line
458
+ #
459
+ # Strokes a horizontal line from +x1+ to +x2+ at the current y position, or
460
+ # the position specified by the :at option.
461
+ #
462
+ # :call-seq:
463
+ # stroke_horizontal_line(x1,x2,options={})
464
+
465
+ ##
466
+ # :method: stroke_horizontal_rule
467
+ #
468
+ # Strokes a horizontal line from the left border to the right border of the
469
+ # bounding box at the current y position.
470
+ #
471
+ # :call-seq:
472
+ # stroke_horizontal_rule
473
+
474
+ ##
475
+ # :method: stroke_vertical_line
476
+ #
477
+ # Strokes a vertical line at the x coordinate given by :at from y1 to y2.
478
+ #
479
+ # :call-seq:
480
+ # stroke_vertical_line(y1,y2,params)
481
+
482
+ ##
483
+ # :method: stroke_curve
484
+ #
485
+ # Strokes a Bezier curve between two points, bounded by two additional
486
+ # points.
487
+ #
488
+ # :call-seq:
489
+ # stroke_curve(origin,dest,options={})
490
+
491
+ ##
492
+ # :method: stroke_circle
493
+ #
494
+ # Draws and strokes a circle of radius +radius+ with the centre-point at
495
+ # +point+.
496
+ #
497
+ # :call-seq:
498
+ # stroke_circle(center,radius)
499
+
500
+ ##
501
+ # :method: fill_circle
502
+ #
503
+ # Draws and fills a circle of radius +radius+ with the centre-point at
504
+ # +point+.
505
+ #
506
+ # :call-seq:
507
+ # fill_circle(center,radius)
508
+
509
+ ##
510
+ # :method: fill_and_stroke_circle
511
+ #
512
+ # Draws, strokes, and fills a circle of radius +radius+ with the
513
+ # centre-point at +point+.
514
+ #
515
+ # :call-seq:
516
+ # fill_and_stroke_circle(center,radius)
517
+
518
+ ##
519
+ # :method: stroke_ellipse
520
+ #
521
+ # Draws and strokes an ellipse of x radius +r1+ and y radius +r2+ with the
522
+ # centre-point at +point+.
523
+ #
524
+ # :call-seq:
525
+ # stroke_ellipse(point, r1, r2 = r1)
526
+
527
+ ##
528
+ # :method: fill_ellipse
529
+ #
530
+ # Draws and fills an ellipse of x radius +r1+ and y radius +r2+ with the
531
+ # centre-point at +point+.
532
+ #
533
+ # :call-seq:
534
+ # fill_ellipse(point, r1, r2 = r1)
535
+
536
+ ##
537
+ # :method: fill_and_stroke_ellipse
538
+ #
539
+ # Draws, strokes, and fills an ellipse of x radius +r1+ and y radius +r2+
540
+ # with the centre-point at +point+.
541
+ #
542
+ # :call-seq:
543
+ # fill_and_stroke_ellipse(point, r1, r2 = r1)
544
+
545
+ ##
546
+ # :method: stroke_polygon
547
+ #
548
+ # Draws and strokes a polygon from the specified points.
549
+ #
550
+ # :call-seq:
551
+ # stroke_polygon(*points)
552
+
553
+ ##
554
+ # :method: fill_polygon
555
+ #
556
+ # Draws and fills a polygon from the specified points.
557
+ #
558
+ # :call-seq:
559
+ # fill_polygon(*points)
560
+
561
+ ##
562
+ # :method: fill_and_stroke_polygon
563
+ #
564
+ # Draws, strokes, and fills a polygon from the specified points.
565
+ #
566
+ # :call-seq:
567
+ # fill_and_stroke_polygon(*points)
568
+
569
+ ##
570
+ # :method: stroke_rounded_polygon
571
+ #
572
+ # Draws and strokes a rounded polygon from specified points, using +radius+
573
+ # to define Bezier curves.
574
+ #
575
+ # :call-seq:
576
+ # stroke_rounded_polygon(radius, *points)
577
+
578
+ ##
579
+ # :method: fill_rounded_polygon
580
+ #
581
+ # Draws and fills a rounded polygon from specified points, using +radius+ to
582
+ # define Bezier curves.
583
+ #
584
+ # :call-seq:
585
+ # fill_rounded_polygon(radius, *points)
586
+
587
+ ##
588
+ # :method: fill_and_stroke_rounded_polygon
589
+ #
590
+ # Draws, strokes, and fills a rounded polygon from specified points, using
591
+ # +radius+ to define Bezier curves.
592
+ #
593
+ # :call-seq:
594
+ # fill_and_stroke_rounded_polygon(radius, *points)
595
+
596
+ ops = %w{fill stroke fill_and_stroke}
597
+ shapes = %w{line_to curve_to rectangle rounded_rectangle line horizontal_line horizontal_rule vertical_line
598
+ curve circle_at circle ellipse_at ellipse polygon rounded_polygon rounded_vertex}
599
+
600
+ ops.product(shapes).each do |operation,shape|
601
+ class_eval "def #{operation}_#{shape}(*args); #{shape}(*args); #{operation}; end"
347
602
  end
348
603
 
349
604
  private
350
-
605
+
351
606
  def current_line_width
352
607
  graphic_state.line_width
353
608
  end
354
-
609
+
355
610
  def current_line_width=(width)
356
611
  graphic_state.line_width = width
357
612
  end
358
-
613
+
359
614
  def write_line_width
360
615
  add_content("#{current_line_width} w")
361
616
  end
@@ -372,7 +627,7 @@ module Prawn
372
627
  def degree_to_rad(angle)
373
628
  angle * Math::PI / 180
374
629
  end
375
-
630
+
376
631
  # Returns the coordinates for a point on a line that is a given distance away from the second
377
632
  # point defining the line segement
378
633
  def point_on_line(distance_from_end, *points)
@@ -383,6 +638,6 @@ module Prawn
383
638
  yr = y0 + p*(y1 - y0)
384
639
  [xr, yr]
385
640
  end
386
-
641
+
387
642
  end
388
643
  end
@@ -0,0 +1,36 @@
1
+ module Prawn
2
+ # @group Extension API
3
+
4
+ def self.image_handler
5
+ @image_handler ||= ImageHandler.new
6
+ end
7
+
8
+ class ImageHandler
9
+ def initialize
10
+ @handlers = []
11
+ end
12
+
13
+ def register(handler)
14
+ @handlers.delete(handler)
15
+ @handlers.push handler
16
+ end
17
+
18
+ def register!(handler)
19
+ @handlers.delete(handler)
20
+ @handlers.unshift handler
21
+ end
22
+
23
+ def unregister(handler)
24
+ @handlers.reject!{ |h| h == handler }
25
+ end
26
+
27
+ def find(image_blob)
28
+ handler = @handlers.find{ |h| h.can_render? image_blob }
29
+
30
+ return handler if handler
31
+
32
+ raise Prawn::Errors::UnsupportedImageType,
33
+ "image file is an unrecognised format"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ # image.rb : Base class for image info objects
3
+ #
4
+ # Copyright September 2011, Brad Ediger. All rights reserved.
5
+ #
6
+ # This is free software. Please see the LICENSE and COPYING files for details.
7
+
8
+ require 'digest/sha1'
9
+
10
+ module Prawn
11
+ module Images
12
+ class Image
13
+ # @group Extension API
14
+
15
+ def calc_image_dimensions(options)
16
+ w = options[:width] || width
17
+ h = options[:height] || height
18
+
19
+ if options[:width] && !options[:height]
20
+ wp = w / width.to_f
21
+ w = width * wp
22
+ h = height * wp
23
+ elsif options[:height] && !options[:width]
24
+ hp = h / height.to_f
25
+ w = width * hp
26
+ h = height * hp
27
+ elsif options[:scale]
28
+ w = width * options[:scale]
29
+ h = height * options[:scale]
30
+ elsif options[:fit]
31
+ bw, bh = options[:fit]
32
+ bp = bw / bh.to_f
33
+ ip = width / height.to_f
34
+ if ip > bp
35
+ w = bw
36
+ h = bw / ip
37
+ else
38
+ h = bh
39
+ w = bh * ip
40
+ end
41
+ end
42
+ self.scaled_width = w
43
+ self.scaled_height = h
44
+
45
+ [w,h]
46
+ end
47
+ end
48
+ end
49
+ end
@@ -10,15 +10,21 @@ require 'stringio'
10
10
 
11
11
  module Prawn
12
12
  module Images
13
+
13
14
  # A convenience class that wraps the logic for extracting the parts
14
15
  # of a JPG image that we need to embed them in a PDF
15
16
  #
16
- class JPG
17
+ class JPG < Image
18
+ # @group Extension API
19
+
17
20
  attr_reader :width, :height, :bits, :channels
18
21
  attr_accessor :scaled_width, :scaled_height
19
-
20
- JPEG_SOF_BLOCKS = %W(\xc0 \xc1 \xc2 \xc3 \xc5 \xc6 \xc7 \xc9 \xca \xcb \xcd \xce \xcf)
21
- JPEG_APP_BLOCKS = %W(\xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef)
22
+
23
+ JPEG_SOF_BLOCKS = [0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF]
24
+
25
+ def self.can_render?(image_blob)
26
+ image_blob[0, 3].unpack("C*") == [255, 216, 255]
27
+ end
22
28
 
23
29
  # Process a new JPG image
24
30
  #
@@ -26,20 +32,21 @@ module Prawn
26
32
  #
27
33
  def initialize(data)
28
34
  @data = data
29
- data = StringIO.new(data.dup)
35
+ d = StringIO.new(@data)
36
+ d.binmode
30
37
 
31
- c_marker = "\xff" # Section marker.
32
- data.read(2) # Skip the first two bytes of JPEG identifier.
38
+ c_marker = 0xff # Section marker.
39
+ d.seek(2) # Skip the first two bytes of JPEG identifier.
33
40
  loop do
34
- marker, code, length = data.read(4).unpack('aan')
41
+ marker, code, length = d.read(4).unpack('CCn')
35
42
  raise "JPEG marker not found!" if marker != c_marker
36
43
 
37
44
  if JPEG_SOF_BLOCKS.include?(code)
38
- @bits, @height, @width, @channels = data.read(6).unpack("CnnC")
45
+ @bits, @height, @width, @channels = d.read(6).unpack("CnnC")
39
46
  break
40
47
  end
41
48
 
42
- buffer = data.read(length - 2)
49
+ d.seek(length - 2, IO::SEEK_CUR)
43
50
  end
44
51
  end
45
52
 
@@ -61,13 +68,11 @@ module Prawn
61
68
  obj = document.ref!(
62
69
  :Type => :XObject,
63
70
  :Subtype => :Image,
64
- :Filter => :DCTDecode,
65
71
  :ColorSpace => color_space,
66
72
  :BitsPerComponent => bits,
67
73
  :Width => width,
68
- :Height => height,
69
- :Length => @data.size
70
- )
74
+ :Height => height
75
+ )
71
76
 
72
77
  # add extra decode params for CMYK images. By swapping the
73
78
  # min and max values from the default, we invert the colours. See
@@ -76,7 +81,8 @@ module Prawn
76
81
  obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ]
77
82
  end
78
83
 
79
- obj << @data
84
+ obj.stream << @data
85
+ obj.stream.filters << :DCTDecode
80
86
  obj
81
87
  end
82
88