prawn 0.13.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -1,651 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "When drawing a line" do
6
-
7
- before(:each) { create_pdf }
8
-
9
- it "should draw a line from (100,600) to (100,500)" do
10
- @pdf.line([100,600],[100,500])
11
-
12
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
13
-
14
- line_drawing.points.should == [[100,600],[100,500]]
15
- end
16
-
17
- it "should draw two lines at (100,600) to (100,500) " +
18
- "and (75,100) to (50,125)" do
19
- @pdf.line(100,600,100,500)
20
- @pdf.line(75,100,50,125)
21
-
22
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
23
-
24
- line_drawing.points.should ==
25
- [[100.0, 600.0], [100.0, 500.0], [75.0, 100.0], [50.0, 125.0]]
26
- end
27
-
28
- it "should properly set line width via line_width=" do
29
- @pdf.line_width = 10
30
- line = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
31
- line.widths.first.should == 10
32
- end
33
-
34
- it "should properly set line width via line_width(width)" do
35
- @pdf.line_width(10)
36
- line = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
37
- line.widths.first.should == 10
38
- end
39
-
40
- it "should carry the current line width settings over to new pages" do
41
- @pdf.line_width(10)
42
- @pdf.start_new_page
43
- line = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
44
- line.widths.length.should == 2
45
- line.widths[1].should == 10
46
- end
47
-
48
- describe "(Horizontally)" do
49
- it "should draw from [x1,pdf.y],[x2,pdf.y]" do
50
- @pdf.horizontal_line(100,150)
51
- @line = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
52
- @line.points.should == [[100.0 + @pdf.bounds.absolute_left, @pdf.y],
53
- [150.0 + @pdf.bounds.absolute_left, @pdf.y]]
54
- end
55
-
56
- it "should draw a line from (200, 250) to (300, 250)" do
57
- @pdf.horizontal_line(200,300,:at => 250)
58
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
59
- line_drawing.points.should == [[200,250],[300,250]]
60
- end
61
- end
62
-
63
- describe "(Vertically)" do
64
- it "should draw a line from (350, 300) to (350, 400)" do
65
- @pdf.vertical_line(300,400,:at => 350)
66
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
67
- line_drawing.points.should == [[350,300],[350,400]]
68
- end
69
- it "should require a y coordinate" do
70
- lambda { @pdf.vertical_line(400,500) }.
71
- should raise_error(ArgumentError)
72
- end
73
- end
74
-
75
- end
76
-
77
- describe "When drawing a polygon" do
78
-
79
- before(:each) { create_pdf }
80
-
81
- it "should draw each line passed to polygon()" do
82
- @pdf.polygon([100,500],[100,400],[200,400])
83
-
84
- line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render)
85
- line_drawing.points.should == [[100,500],[100,400],[200,400],[100,500]]
86
- end
87
-
88
- end
89
-
90
- describe "When drawing a rectangle" do
91
-
92
- before(:each) { create_pdf }
93
-
94
- it "should use a point, width, and height for coords" do
95
- @pdf.rectangle [200,200], 50, 100
96
-
97
- rectangles = PDF::Inspector::Graphics::Rectangle.
98
- analyze(@pdf.render).rectangles
99
- # PDF uses bottom left corner
100
- rectangles[0][:point].should == [200,100]
101
- rectangles[0][:width].should == 50
102
- rectangles[0][:height].should == 100
103
-
104
- end
105
-
106
- end
107
-
108
- describe "When drawing a curve" do
109
-
110
- before(:each) { create_pdf }
111
-
112
- it "should draw a bezier curve from 50,50 to 100,100" do
113
- @pdf.move_to [50,50]
114
- @pdf.curve_to [100,100],:bounds => [[20,90], [90,70]]
115
- curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
116
- curve.coords.should == [50.0, 50.0, 20.0, 90.0, 90.0, 70.0, 100.0, 100.0]
117
- end
118
-
119
- it "should draw a bezier curve from 100,100 to 50,50" do
120
- @pdf.curve [100,100], [50,50], :bounds => [[20,90], [90,75]]
121
- curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
122
- curve.coords.should == [100.0, 100.0, 20.0, 90.0, 90.0, 75.0, 50.0, 50.0]
123
- end
124
-
125
-
126
- end
127
-
128
- describe "When drawing a rounded rectangle" do
129
- before(:each) do
130
- create_pdf
131
- @pdf.rounded_rectangle([50, 550], 50, 100, 10)
132
- curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
133
- curve_points = []
134
- curve.coords.each_slice(2) {|p| curve_points << p}
135
- @original_point = curve_points.shift
136
- curves = []
137
- curve_points.each_slice(3) {|c| curves << c}
138
- line_points = PDF::Inspector::Graphics::Line.analyze(@pdf.render).points
139
- line_points.shift
140
- @all_coords = []
141
- line_points.zip(curves).flatten.each_slice(2) {|p| @all_coords << p }
142
- @all_coords.unshift @original_point
143
- end
144
-
145
- it "should draw a rectangle by connecting lines with rounded bezier curves" do
146
- @all_coords.should == [[60.0, 550.0],[90.0, 550.0], [95.523, 550.0], [100.0, 545.523], [100.0, 540.0],
147
- [100.0, 460.0], [100.0, 454.477], [95.523, 450.0], [90.0, 450.0],
148
- [60.0, 450.0], [54.477, 450.0], [50.0, 454.477], [50.0, 460.0],
149
- [50.0, 540.0], [50.0, 545.523], [54.477, 550.0], [60.0, 550.0]]
150
- end
151
-
152
- it "should start and end with the same point" do
153
- @original_point.should == @all_coords.last
154
- end
155
-
156
-
157
- end
158
-
159
- describe "When drawing an ellipse" do
160
- before(:each) do
161
- create_pdf
162
- @pdf.ellipse [100,100], 25, 50
163
- @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
164
- end
165
-
166
- it "should use a Bézier approximation" do
167
- @curve.coords.should ==
168
- [125.0, 100.0,
169
-
170
- 125.0, 127.614,
171
- 113.807, 150,
172
- 100.0, 150.0,
173
-
174
- 86.193, 150.0,
175
- 75.0, 127.614,
176
- 75.0, 100.0,
177
-
178
- 75.0, 72.386,
179
- 86.193, 50.0,
180
- 100.0, 50.0,
181
-
182
- 113.807, 50.0,
183
- 125.0, 72.386,
184
- 125.0, 100.0,
185
-
186
- 100.0, 100.0]
187
- end
188
-
189
- it "should move the pointer to the center of the ellipse after drawing" do
190
- @curve.coords[-2..-1].should == [100,100]
191
- end
192
-
193
- end
194
-
195
- describe "When drawing a circle" do
196
- before(:each) do
197
- create_pdf
198
- @pdf.circle [100,100], 25
199
- @pdf.ellipse [100,100], 25, 25
200
- @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render)
201
- end
202
-
203
- it "should stroke the same path as the equivalent ellipse" do
204
- middle = @curve.coords.length / 2
205
- @curve.coords[0...middle].should == @curve.coords[middle..-1]
206
- end
207
- end
208
-
209
- describe "When filling" do
210
- before(:each) { create_pdf }
211
-
212
- it "should default to the f operator (nonzero winding number rule)" do
213
- @pdf.expects(:add_content).with("f")
214
- @pdf.fill
215
- end
216
-
217
- it "should use f* for :fill_rule => :even_odd" do
218
- @pdf.expects(:add_content).with("f*")
219
- @pdf.fill(:fill_rule => :even_odd)
220
- end
221
-
222
- it "should use b by default for fill_and_stroke (nonzero winding number)" do
223
- @pdf.expects(:add_content).with("b")
224
- @pdf.fill_and_stroke
225
- end
226
-
227
- it "should use b* for fill_and_stroke(:fill_rule => :even_odd)" do
228
- @pdf.expects(:add_content).with("b*")
229
- @pdf.fill_and_stroke(:fill_rule => :even_odd)
230
- end
231
- end
232
-
233
- describe "When setting colors" do
234
-
235
- before(:each) { create_pdf }
236
-
237
- it "should set stroke colors" do
238
- @pdf.stroke_color "ffcccc"
239
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
240
- # 100% red, 80% green, 80% blue
241
- colors.stroke_color.should == [1.0, 0.8, 0.8]
242
- end
243
-
244
- it "should set fill colors" do
245
- @pdf.fill_color "ccff00"
246
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
247
- # 80% red, 100% green, 0% blue
248
- colors.fill_color.should == [0.8,1.0,0]
249
- end
250
-
251
- it "should reset the colors on each new page if they have been defined" do
252
- @pdf.fill_color "ccff00"
253
- #colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
254
-
255
- # colors.fill_color_count.should == 2
256
- # colors.stroke_color_count.should == 1
257
- @pdf.start_new_page
258
- @pdf.stroke_color "ff00cc"
259
-
260
- #colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
261
- # colors.fill_color_count.should == 3
262
-
263
- @pdf.start_new_page
264
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
265
- colors.fill_color_count.should == 3
266
- colors.stroke_color_count.should == 2
267
-
268
- colors.fill_color.should == [0.8,1.0,0.0]
269
- colors.stroke_color.should == [1.0,0.0,0.8]
270
- end
271
-
272
- it "should set the color space when setting colors on new pages to please fussy readers" do
273
- @pdf.stroke_color "000000"
274
- @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) }
275
- @pdf.start_new_page
276
- @pdf.stroke_color "000000"
277
- @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) }
278
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
279
- colors.stroke_color_space_count[:DeviceRGB].should == 2
280
- end
281
- end
282
-
283
- describe "Patterns" do
284
- before(:each) { create_pdf }
285
-
286
- describe 'linear gradients' do
287
- it "should create a /Pattern resource" do
288
- @pdf.fill_gradient [0, @pdf.bounds.height],
289
- [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
290
-
291
- grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
292
- pattern = grad.patterns.values.first
293
-
294
- pattern.should_not be_nil
295
- pattern[:Shading][:ShadingType].should == 2
296
- pattern[:Shading][:Coords].should == [0, 0, @pdf.bounds.width, 0]
297
- pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
298
- (x1-x2).abs < 0.01
299
- }.should be_true
300
- pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
301
- (x1-x2).abs < 0.01
302
- }.should be_true
303
- end
304
-
305
- it "fill_gradient should set fill color to the pattern" do
306
- @pdf.fill_gradient [0, @pdf.bounds.height],
307
- [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
308
-
309
- str = @pdf.render
310
- str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
311
- end
312
-
313
- it "stroke_gradient should set stroke color to the pattern" do
314
- @pdf.stroke_gradient [0, @pdf.bounds.height],
315
- [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
316
-
317
- str = @pdf.render
318
- str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
319
- end
320
- end
321
-
322
- describe 'radial gradients' do
323
- it "should create a /Pattern resource" do
324
- @pdf.fill_gradient [0, @pdf.bounds.height], 10,
325
- [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
326
-
327
- grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
328
- pattern = grad.patterns.values.first
329
-
330
- pattern.should_not be_nil
331
- pattern[:Shading][:ShadingType].should == 3
332
- pattern[:Shading][:Coords].should == [0, 0, 10, @pdf.bounds.width, 0, 20]
333
- pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
334
- (x1-x2).abs < 0.01
335
- }.should be_true
336
- pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
337
- (x1-x2).abs < 0.01
338
- }.should be_true
339
- end
340
-
341
- it "fill_gradient should set fill color to the pattern" do
342
- @pdf.fill_gradient [0, @pdf.bounds.height], 10,
343
- [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
344
-
345
- str = @pdf.render
346
- str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
347
- end
348
-
349
- it "stroke_gradient should set stroke color to the pattern" do
350
- @pdf.stroke_gradient [0, @pdf.bounds.height], 10,
351
- [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
352
-
353
- str = @pdf.render
354
- str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
355
- end
356
- end
357
- end
358
-
359
- describe "When using painting shortcuts" do
360
- before(:each) { create_pdf }
361
-
362
- it "should convert stroke_some_method(args) into some_method(args); stroke" do
363
- @pdf.expects(:line_to).with([100,100])
364
- @pdf.expects(:stroke)
365
-
366
- @pdf.stroke_line_to [100,100]
367
- end
368
-
369
- it "should convert fill_some_method(args) into some_method(args); fill" do
370
- @pdf.expects(:line_to).with([100,100])
371
- @pdf.expects(:fill)
372
-
373
- @pdf.fill_line_to [100,100]
374
- end
375
-
376
- it "should not break method_missing" do
377
- lambda { @pdf.i_have_a_pretty_girlfriend_named_jia }.
378
- should raise_error(NoMethodError)
379
- end
380
- end
381
-
382
- describe "When using graphics states" do
383
- before(:each) { create_pdf }
384
-
385
- it "should add the right content on save_graphics_state" do
386
- @pdf.expects(:add_content).with('q')
387
-
388
- @pdf.save_graphics_state
389
- end
390
-
391
- it "should add the right content on restore_graphics_state" do
392
- @pdf.expects(:add_content).with('Q')
393
-
394
- @pdf.restore_graphics_state
395
- end
396
-
397
- it "should save and restore when save_graphics_state is used with a block" do
398
- state = sequence "state"
399
- @pdf.expects(:add_content).with('q').in_sequence(state)
400
- @pdf.expects(:foo).in_sequence(state)
401
- @pdf.expects(:add_content).with('Q').in_sequence(state)
402
-
403
- @pdf.save_graphics_state do
404
- @pdf.foo
405
- end
406
- end
407
-
408
- it "should add the previous color space when restoring to a graphic state with different color space" do
409
- @pdf.stroke_color '000000'
410
- @pdf.save_graphics_state
411
- @pdf.stroke_color 0, 0, 0, 0
412
- @pdf.restore_graphics_state
413
- @pdf.stroke_color 0, 0, 100, 0
414
- @pdf.graphic_state.color_space.should == {:stroke=>:DeviceCMYK}
415
- colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render)
416
- colors.color_space.should == :DeviceCMYK
417
- colors.stroke_color_space_count[:DeviceCMYK].should == 2
418
- end
419
-
420
- it "should use the correct dash setting after restoring and starting new page" do
421
- @pdf.dash 5
422
- @pdf.save_graphics_state
423
- @pdf.dash 10
424
- @pdf.graphic_state.dash[:dash].should == 10
425
- @pdf.restore_graphics_state
426
- @pdf.start_new_page
427
- @pdf.graphic_state.dash[:dash].should == 5
428
- end
429
-
430
- it "the current graphic state should keep track of previous unchanged settings" do
431
- @pdf.stroke_color '000000'
432
- @pdf.save_graphics_state
433
- @pdf.dash 5
434
- @pdf.save_graphics_state
435
- @pdf.cap_style :round
436
- @pdf.save_graphics_state
437
- @pdf.fill_color 0, 0, 100, 0
438
- @pdf.save_graphics_state
439
-
440
- @pdf.graphic_state.stroke_color.should == "000000"
441
- @pdf.graphic_state.join_style.should == :miter
442
- @pdf.graphic_state.fill_color.should == [0, 0, 100, 0]
443
- @pdf.graphic_state.cap_style.should == :round
444
- @pdf.graphic_state.color_space.should == {:fill=>:DeviceCMYK, :stroke=>:DeviceRGB}
445
- @pdf.graphic_state.dash.should == {:space=>5, :phase=>0, :dash=>5}
446
- @pdf.graphic_state.line_width.should == 1
447
- end
448
-
449
-
450
-
451
- it "should not add extra graphic space closings when rendering multiple times" do
452
- @pdf.render
453
- state = PDF::Inspector::Graphics::State.analyze(@pdf.render)
454
- state.save_graphics_state_count.should == 1
455
- state.restore_graphics_state_count.should == 1
456
- end
457
-
458
- it "should add extra graphic state enclosings when content is added on multiple renderings" do
459
- @pdf.render
460
- @pdf.text "Adding a bit more content"
461
- state = PDF::Inspector::Graphics::State.analyze(@pdf.render)
462
- state.save_graphics_state_count.should == 2
463
- state.restore_graphics_state_count.should == 2
464
- end
465
-
466
- it "adds extra graphic state enclosings when new settings are applied on multiple renderings" do
467
- @pdf.render
468
- @pdf.stroke_color 0, 0, 0, 0
469
- state = PDF::Inspector::Graphics::State.analyze(@pdf.render)
470
- state.save_graphics_state_count.should == 2
471
- state.restore_graphics_state_count.should == 2
472
- end
473
-
474
-
475
- it "should raise_error error if closing an empty graphic stack" do
476
- lambda {
477
- @pdf.render
478
- @pdf.restore_graphics_state
479
- }.should raise_error(PDF::Core::Errors::EmptyGraphicStateStack)
480
- end
481
- end
482
-
483
- describe "When using transformation matrix" do
484
- before(:each) { create_pdf }
485
-
486
- # Note: The (approximate) number of significant decimal digits of precision in fractional
487
- # part is 5 (PDF Reference, Third Edition, p. 706)
488
-
489
- it "should send the right content on transformation_matrix" do
490
- @pdf.expects(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm')
491
- @pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20
492
- end
493
-
494
- it "should use fixed digits with very small number" do
495
- values = Array.new(6, 0.000000000001)
496
- string = Array.new(6, "0.00000").join " "
497
- @pdf.expects(:add_content).with("#{string} cm")
498
- @pdf.transformation_matrix *values
499
- end
500
-
501
- it "should be received by the inspector" do
502
- @pdf.transformation_matrix 1, 0, 0, -1, 5.5, 20
503
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
504
- matrices.matrices.should == [[1, 0, 0, -1, 5.5, 20]]
505
- end
506
-
507
- it "should save the graphics state inside the given block" do
508
- values = Array.new(6, 0.000000000001)
509
- string = Array.new(6, "0.00000").join " "
510
- process = sequence "process"
511
-
512
- @pdf.expects(:save_graphics_state).with().in_sequence(process)
513
- @pdf.expects(:add_content).with("#{string} cm").in_sequence(process)
514
- @pdf.expects(:do_something).with().in_sequence(process)
515
- @pdf.expects(:restore_graphics_state).with().in_sequence(process)
516
- @pdf.transformation_matrix(*values) do
517
- @pdf.do_something
518
- end
519
- end
520
-
521
- end
522
-
523
- describe "When using transformations shortcuts" do
524
- before(:each) do
525
- create_pdf
526
- @x, @y = 12, 54.32
527
- @angle = 12.32
528
- @cos = Math.cos(@angle * Math::PI / 180)
529
- @sin = Math.sin(@angle * Math::PI / 180)
530
- @factor = 0.12
531
- end
532
-
533
- describe "#rotate" do
534
- it "should rotate" do
535
- @pdf.expects(:transformation_matrix).with(@cos, @sin, -@sin, @cos, 0, 0)
536
- @pdf.rotate(@angle)
537
- end
538
- end
539
-
540
- describe "#rotate with :origin option" do
541
- it "should rotate around the origin" do
542
- x_prime = @x * @cos - @y * @sin
543
- y_prime = @x * @sin + @y * @cos
544
-
545
- @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') }
546
-
547
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
548
- matrices.matrices[0].should == [1, 0, 0, 1,
549
- reduce_precision(@x - x_prime),
550
- reduce_precision(@y - y_prime)]
551
- matrices.matrices[1].should == [reduce_precision(@cos),
552
- reduce_precision(@sin),
553
- reduce_precision(-@sin),
554
- reduce_precision(@cos), 0, 0]
555
- end
556
-
557
- it "should rotate around the origin in a document with a margin" do
558
- @pdf = Prawn::Document.new
559
-
560
- @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') }
561
-
562
- x = @x + @pdf.bounds.absolute_left
563
- y = @y + @pdf.bounds.absolute_bottom
564
- x_prime = x * @cos - y * @sin
565
- y_prime = x * @sin + y * @cos
566
-
567
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
568
- matrices.matrices[0].should == [1, 0, 0, 1,
569
- reduce_precision(x - x_prime),
570
- reduce_precision(y - y_prime)]
571
- matrices.matrices[1].should == [reduce_precision(@cos),
572
- reduce_precision(@sin),
573
- reduce_precision(-@sin),
574
- reduce_precision(@cos), 0, 0]
575
- end
576
-
577
- it "should raise_error BlockRequired if no block is given" do
578
- lambda {
579
- @pdf.rotate(@angle, :origin => [@x, @y])
580
- }.should raise_error(Prawn::Errors::BlockRequired)
581
- end
582
-
583
- def reduce_precision(float)
584
- ("%.5f" % float).to_f
585
- end
586
- end
587
-
588
- describe "#translate" do
589
- it "should translate" do
590
- x, y = 12, 54.32
591
- @pdf.expects(:transformation_matrix).with(1, 0, 0, 1, x, y)
592
- @pdf.translate(x, y)
593
- end
594
- end
595
-
596
- describe "#scale" do
597
- it "should scale" do
598
- @pdf.expects(:transformation_matrix).with(@factor, 0, 0, @factor, 0, 0)
599
- @pdf.scale(@factor)
600
- end
601
- end
602
-
603
- describe "#scale with :origin option" do
604
- it "should scale from the origin" do
605
- x_prime = @factor * @x
606
- y_prime = @factor * @y
607
-
608
- @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') }
609
-
610
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
611
- matrices.matrices[0].should == [1, 0, 0, 1,
612
- reduce_precision(@x - x_prime),
613
- reduce_precision(@y - y_prime)]
614
- matrices.matrices[1].should == [@factor, 0, 0, @factor, 0, 0]
615
- end
616
-
617
- it "should scale from the origin in a document with a margin" do
618
- @pdf = Prawn::Document.new
619
- x = @x + @pdf.bounds.absolute_left
620
- y = @y + @pdf.bounds.absolute_bottom
621
- x_prime = @factor * x
622
- y_prime = @factor * y
623
-
624
- @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') }
625
-
626
- matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render)
627
- matrices.matrices[0].should == [1, 0, 0, 1,
628
- reduce_precision(x - x_prime),
629
- reduce_precision(y - y_prime)]
630
- matrices.matrices[1].should == [@factor, 0, 0, @factor, 0, 0]
631
- end
632
-
633
- it "should raise_error BlockRequired if no block is given" do
634
- lambda {
635
- @pdf.scale(@factor, :origin => [@x, @y])
636
- }.should raise_error(Prawn::Errors::BlockRequired)
637
- end
638
-
639
- def reduce_precision(float)
640
- ("%.5f" % float).to_f
641
- end
642
- end
643
-
644
- # describe "skew" do
645
- # it "should skew" do
646
- # a, b = 30, 50.2
647
- # @pdf.expects(:transformation_matrix).with(1, Math.tan(a * Math::PI / 180), Math.tan(b * Math::PI / 180), 1, 0, 0)
648
- # @pdf.skew(a, b)
649
- # end
650
- # end
651
- end